trunk 20080912
[gitenigma.git] / src / swapmanager.cpp
blob21c6b6f0958991d5d18693d35bdff7aead5d0b6d
1 /*
2 $Id: swapmanager.cpp, V1.00 2008/01/08 21:23:00 Dre
3 Swap Manager for Enigma 1
4 Copyright (C) 2007 - 2008 Dre
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #ifndef DISABLE_HDD
22 #ifndef DISABLE_FILE
24 #include <swapmanager.h>
26 using namespace std;
28 //Main GUI
29 eSwapManager::eSwapManager(): eWindow(0), createSwapfile(0)
32 cmove(ePoint(100,120));
33 cresize(eSize(500, 370));
34 setText(_("Swap Manager"));
36 //Statusbar
37 statusbar=new eStatusBar(this);
38 statusbar->move( ePoint(0, clientrect.height()-50 ) );
39 statusbar->resize( eSize( clientrect.width(), 50) );
40 statusbar->loadDeco();
42 setHelpID(155);
44 //Boxmodell for hdd-path
45 getBoxType();
47 //Config laden
48 swap=0;
49 int pos =0;
50 int length = 0;
51 eString file;
52 file = "myswap";
53 filename=0;
54 eString path;
55 path = eString().sprintf("%susb/", mntbase.c_str() );
56 eConfig::getInstance()->getKey("/extras/swapfilename", swap);
59 //Label und Combobox für den Dateinamen
60 lb_file=new eLabel(this);
61 lb_file->setText(_("Filename: "));//Dateiname
62 lb_file->move(ePoint(20, 20));
63 lb_file->resize(eSize(200, 30));
65 cb_file=new eComboBox(this, 4, lb_file);
66 cb_file->move(ePoint(250, 20));
67 cb_file->resize(eSize(240, 30));
68 cb_file->loadDeco();
69 cb_file->setHelpText(_("Push OK to select Filename"));
71 new eListBoxEntryText( *cb_file, "swap", (void*)0, 0, eString().sprintf("%s%s", _("Filename: "), "swap"));
72 new eListBoxEntryText( *cb_file, "swapfile", (void*)1, 0, eString().sprintf("%s%s", _("Filename: "), "swapfile"));
73 new eListBoxEntryText( *cb_file, "myswap", (void*)2, 0, eString().sprintf("%s%s", _("Filename: "), "myswap"));
74 if(swap != 0)
76 eString s = eString(swap);
77 pos = s.find_last_of("/");
78 length = s.length()-1;
79 file = s.substr(pos+1, length-1);
80 if ( file == "swapfile")
82 filename=1;
84 else if (file == "myswap")
86 filename=2;
88 else if (file == "swap")
90 filename=0;
92 else
94 filename=3;
95 new eListBoxEntryText( *cb_file, file.c_str(), (void*)3, 0, eString().sprintf("%s%s", _("Filename: "), file.c_str() ) );
97 path = s.substr(0, pos+1);
100 cb_file->setCurrent(filename, true);
102 CONNECT(cb_file->selchanged, eSwapManager::searchSwap);
104 //Label und Combobox für das Verzeichnis
105 lb_mnt=new eLabel(this);
106 lb_mnt->setText(_("Directory:"));//Speicherort
107 lb_mnt->move(ePoint(20, 70));
108 lb_mnt->resize(eSize(200, 30));
110 cb_mnt=new eComboBox(this,4, lb_mnt);
111 cb_mnt->move(ePoint(250, 70));
112 cb_mnt->resize(eSize(240, 30));
113 cb_mnt->loadDeco();
114 cb_mnt->setHelpText(_("Push OK to select directory"));
116 new eListBoxEntryText( *cb_mnt, eString().sprintf("%susb/",mntbase.c_str()), (void*)0, 0, eString().sprintf( "%s %susb/",_("Directory:"),mntbase.c_str()));
117 new eListBoxEntryText( *cb_mnt, eString().sprintf("%s", hdddir.c_str()), (void*)1, 0, eString().sprintf( "%s %s",_("Directory:"), hdddir.c_str() ));
118 new eListBoxEntryText( *cb_mnt, eString().sprintf("%scf/",mntbase.c_str()), (void*)2, 0, eString().sprintf( "%s %scf/",_("Directory:"),mntbase.c_str()));
120 if(path == eString().sprintf("%susb/",mntbase.c_str()))
122 pathname=0;
124 else if(path == hdddir)
126 pathname=1;
128 else if(path == eString().sprintf("%scf/",mntbase.c_str()))
130 pathname=2;
132 else
134 pathname=3;
135 new eListBoxEntryText( *cb_mnt, path.c_str(), (void*)3, 0, eString().sprintf( "%s%s",_("Directory:"), path.c_str() ) );
138 cb_mnt->setCurrent(pathname, true);
140 //Suchen nach dem Swapfile
141 CONNECT(cb_mnt->selchanged, eSwapManager::searchSwap);
143 //Label und Combobox für die Dateigrösse
144 lb_size=new eLabel(this);
145 lb_size->setText(_("Filesize:"));//Dateigroesse
146 lb_size->move(ePoint(20, 120));
147 lb_size->resize(eSize(200, 30));
149 cb_size=new eComboBox(this, 4, lb_size);
150 cb_size->move(ePoint(250, 120));
151 cb_size->resize(eSize(240, 30));
152 cb_size->loadDeco();
153 cb_size->setHelpText(_("Push OK to select Filesize"));
155 new eListBoxEntryText( *cb_size, "0 MB", (void*)0, 0, eString().sprintf(_("Filesize: %d MB"),0).c_str());
156 new eListBoxEntryText( *cb_size, "8 MB", (void*)8, 0, eString().sprintf(_("Filesize: %d MB"),8).c_str());
157 new eListBoxEntryText( *cb_size, "16 MB", (void*)16, 0, eString().sprintf(_("Filesize: %d MB"),16).c_str());
158 new eListBoxEntryText( *cb_size, "32 MB", (void*)32, 0, eString().sprintf(_("Filesize: %d MB"),32).c_str());
159 new eListBoxEntryText( *cb_size, "64 MB", (void*)64, 0, eString().sprintf(_("Filesize: %d MB"),64).c_str());
160 new eListBoxEntryText( *cb_size, "128 MB", (void*)128, 0, eString().sprintf(_("Filesize: %d MB"),128).c_str());
161 new eListBoxEntryText( *cb_size, "256 MB", (void*)256, 0, eString().sprintf(_("Filesize: %d MB"),256).c_str());
162 new eListBoxEntryText( *cb_size, "512 MB", (void*)512, 0, eString().sprintf(_("Filesize: %d MB"),512).c_str());
163 new eListBoxEntryText( *cb_size, "1024 MB", (void*)1024, 0, eString().sprintf(_("Filesize: %d MB"),1024).c_str());
165 //Abfragen der Grösse
166 getSize();
168 //Button zum Löschen des Swapfiles
169 bt_delswap = new eButton(this);
170 bt_delswap->move(ePoint(250, 270));
171 bt_delswap->resize(eSize(240, 30));
172 bt_delswap->setShortcut("yellow");
173 bt_delswap->setShortcutPixmap("yellow");
174 bt_delswap->setText(_("Delete Swap-File"));//Swap-File loeschen
175 bt_delswap->setHelpText(_("Delete Swap-File"));
176 bt_delswap->loadDeco();
177 bt_delswap->hide();
179 CONNECT(bt_delswap->selected, eSwapManager::deleteSwap);
181 //Button zum Deaktivieren des Swapfiles
182 bt_stswap = new eButton(this);
183 bt_stswap->move(ePoint(10, 270));
184 bt_stswap->resize(eSize(230, 30));
185 bt_stswap->setShortcut("red");
186 bt_stswap->setShortcutPixmap("red");
187 bt_stswap->setText(_("Stop Swap"));
188 bt_stswap->setHelpText(_("Stop Swap"));//ausschalten
189 bt_stswap->loadDeco();
190 bt_stswap->hide();
192 CONNECT(bt_stswap->selected, eSwapManager::stopSwap);
194 //Button zum Erstellen des Swapfiles
195 bt_crswap = new eButton(this);
196 bt_crswap->move(ePoint(250, 270));
197 bt_crswap->resize(eSize(240, 30));
198 bt_crswap->setShortcut("blue");
199 bt_crswap->setShortcutPixmap("blue");
200 bt_crswap->setText(_("Create Swap-File"));//erstellen
201 bt_crswap->setHelpText(_("Create Swap-File"));
202 bt_crswap->loadDeco();
203 bt_crswap->hide();
205 CONNECT(bt_crswap->selected, eSwapManager::createSwap);
207 //Button zum Aktivieren des Swapfiles
208 bt_acswap = new eButton(this);
209 bt_acswap->move(ePoint(10, 270));
210 bt_acswap->resize(eSize(230, 30));
211 bt_acswap->setShortcut("green");
212 bt_acswap->setShortcutPixmap("green");
213 bt_acswap->setText(_("Start Swap"));
214 bt_acswap->setHelpText(_("Start Swap"));// einschalten
215 bt_acswap->loadDeco();
216 bt_acswap->hide();
218 CONNECT(bt_acswap->selected, eSwapManager::activateSwap);
220 //Label für die Gefunden-/Nicht gefunden-Anzeige
221 lb_found= new eLabel(this);
222 lb_found->move(ePoint(20, 220));
223 lb_found->resize(eSize(400, 30));
225 //Label für die Aktiv-/Inaktiv-Anzeige
226 lb_status= new eLabel(this);
227 lb_status->move(ePoint(20, 170));
228 lb_status->resize(eSize(400, 30));
230 //Abfragen, ob Swapfile existiert
231 searchSwapLight();
234 void eSwapManager::getBoxType()
236 int boxtype = eSystemInfo::getInstance()->getHwType();
238 switch( boxtype )
240 case eSystemInfo::DM500:
241 case eSystemInfo::DM5600:
242 case eSystemInfo::DM5620:
243 case eSystemInfo::TR_DVB272S:
244 case eSystemInfo::DM7000:
245 default:
246 hdddir = "/hdd/";
247 mntbase = "/var/mnt/";
248 break;
249 case eSystemInfo::DM500PLUS:
250 case eSystemInfo::DM600PVR:
251 case eSystemInfo::DM7020:
252 hdddir = "/media/hdd/";
253 mntbase = "/media/";
254 break;
259 //Abfragen der aktuell aktiven Swaps
260 void eSwapManager::getCurrentSwaps()
262 s=0;
264 char swapbuffer[150];
266 FILE *j = fopen("/proc/swaps", "r");
267 if(j)
269 while(fgets(swapbuffer, 75, j))
271 eString dummystring;
272 dummystring = swapbuffer;
273 std::stringstream tmp;
274 tmp.str(dummystring);
275 tmp >> dummystring;
276 swaps[s] = dummystring;
277 s++;
279 fclose(j);
283 //Aktiv/Inaktiv abfragen
284 void eSwapManager::getState()
286 getCurrentSwaps();
288 swapstatus=0;
290 for(int m=0; m < s; m++)
292 if(swaps[m] == store)
294 swapstatus = 1;
295 break;
300 //Grösse abfragen
301 void eSwapManager::getSize()
304 eString tmp = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
306 struct stat sw;
307 int used=0;
309 if (stat(tmp.c_str(), &sw) != -1)
310 used=sw.st_size;
311 used/=(1024*1024);
313 if( used > 1024 )
315 new eListBoxEntryText( *cb_size, eString().sprintf("%d MB", used), (void*)used, 0, eString().sprintf(_("Filesize: %d MB"), used));
317 cb_size->setCurrent((void*)used, true);
320 //Buttons handeln
321 void eSwapManager::setButtons()
323 if(swapfound == 0)
325 bt_stswap->hide();
326 bt_acswap->hide();
327 bt_delswap->hide();
328 bt_crswap->show();
329 found = eString().sprintf(_("Not found"));
330 status = eString().sprintf(_("Inactive"));
332 else if(swapfound == 1 && swapstatus == 0)
334 bt_stswap->hide();
335 bt_acswap->show();
336 bt_delswap->show();
337 bt_crswap->hide();
338 found = eString().sprintf(_("Found"));
339 status = eString().sprintf(_("Inactive"));
341 else if(swapfound == 1 && swapstatus == 1)
343 bt_stswap->show();
344 bt_acswap->hide();
345 bt_delswap->hide();
346 bt_crswap->hide();
347 found = eString().sprintf(_("Found"));
348 status = eString().sprintf(_("Active"));
351 lb_found->setText(eString().sprintf(_("Swap-File: %s"), found.c_str()));
352 lb_status->setText(eString().sprintf(_("Swap-Status: %s"), status.c_str()));
355 //Swapfile suchen (mit Listbox)
356 void eSwapManager::searchSwap(eListBoxEntryText *seltype)
358 store = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
360 struct stat st;
361 if (lstat(store.c_str(),&st) != -1)
363 swapfound=1;
364 getState();
365 getSize();
367 else
369 swapfound=0;
370 swapstate=0;
372 setButtons();
375 //Swapfile suchen (ohne Listbox)
376 void eSwapManager::searchSwapLight()
378 store = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
379 struct stat st;
380 if (lstat(store.c_str(),&st) != -1)
382 swapfound=1;
383 getState();
384 getSize();
386 else
388 swapfound=0;
389 swapstate=0;
391 setButtons();
394 //Swapfile erstellen
395 void eSwapManager::createSwap()
397 int bytesize=(int)cb_size->getCurrent()->getKey() * 1024;
399 store = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
401 info = new eMessageBox (_("The swapfile will now be created. This may take some time depending on the size of your swapfile"), _("Swap Manager"), 0);
402 info->zOrderRaise();
403 info->show();
405 eString command = eString().sprintf("dd if=/dev/zero of=%s bs=1024 count=%d", store.c_str(), bytesize );
407 if (!createSwapfile)
409 createSwapfile = new eConsoleAppContainer(command.c_str());
410 CONNECT(createSwapfile->appClosed, eSwapManager::appClosed);
415 //Swapfile erstellt
416 void eSwapManager::appClosed(int)
418 delete createSwapfile;
419 createSwapfile=0;
421 int byte=(int)cb_size->getCurrent()->getKey();
423 eString tmp = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
425 struct stat crsize;
426 int created=0;
428 if (stat(tmp.c_str(), &crsize) != -1)
429 created=crsize.st_size;
430 created/=(1024*1024);
432 info->hide();
434 if(created == byte)
436 eMessageBox debug((eString().sprintf(_("The swapfile has been created!"))), _("Swap Manager"), eMessageBox::btOK);
437 debug.show();
438 debug.exec();
439 debug.hide();
441 searchSwapLight();
443 lb_found->setText(eString().sprintf(_("Swap-File: %s"), found.c_str()));
444 if( system(eString().sprintf("mkswap %s", store.c_str() ).c_str()) == 0)
446 int mkvalue = 1;
447 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue);
449 else
451 int mkvalue = 0;
452 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue);
455 else
457 eMessageBox debug((eString().sprintf("%s\n%s",_("There has been an error during creation!"),strerror(errno))), _("Swap Manager"), eMessageBox::iconWarning|eMessageBox::btOK);
458 debug.show();
459 debug.exec();
460 debug.hide();
463 setButtons();
466 //Swapfile aktivieren
467 void eSwapManager::activateSwap()
469 store = cb_mnt->getCurrent()->getText() + cb_file->getCurrent()->getText();
470 int mkvalue = 0;
471 eConfig::getInstance()->getKey("/extras/mkswap", mkvalue);
472 if (mkvalue == 0)
474 if( system(eString().sprintf("mkswap %s", store.c_str() ).c_str()) == 0)
476 int mkvalue = 1;
477 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue);
479 else
481 int mkvalue = 0;
482 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue);
485 if ( system(eString().sprintf("swapon %s%s", cb_mnt->getCurrent()->getText().c_str(), cb_file->getCurrent()->getText().c_str() ).c_str()) == 0 )
487 system("echo 0 > /proc/sys/vm/swappiness");
488 eConfig::getInstance()->setKey("/extras/swapfilename", store.c_str());
489 eConfig::getInstance()->setKey("/extras/swapfile", 1);
490 getState();
491 setButtons();
493 else
495 eMessageBox debug((eString().sprintf("%s\n%s",_("Error during activation!"),strerror(errno))), _("Swap Manager"), eMessageBox::iconWarning|eMessageBox::btOK);
496 debug.show();
497 debug.exec();
498 debug.hide();
502 //Swapfile deaktivieren
503 void eSwapManager::stopSwap()
505 eString selectedSwap = eString().sprintf("%s%s", cb_mnt->getCurrent()->getText().c_str(), cb_file->getCurrent()->getText().c_str() );
507 if ( system(eString().sprintf("swapoff %s", selectedSwap.c_str() ).c_str()) == 0 )
509 if ( selectedSwap == swap)
511 eConfig::getInstance()->setKey("/extras/swapfile", 0);
513 getState();
514 setButtons();
516 else
518 eMessageBox debug((eString().sprintf("%s\n%s",_("Error during inactivation!"),strerror(errno))), _("Swap Manager"), eMessageBox::iconWarning|eMessageBox::btOK);
519 debug.show();
520 debug.exec();
521 debug.hide();
525 //swapfile löschen
526 void eSwapManager::deleteSwap()
528 if ( system(eString().sprintf("rm -f %s%s", cb_mnt->getCurrent()->getText().c_str(), cb_file->getCurrent()->getText().c_str() ).c_str()) == 0 )
530 // eConfig::getInstance()->setKey("/extras/swapfilename", "/var/mnt/usb/myswap");
531 eMessageBox debug((_("Swapfile has been deleted!")), ("Swap Manager"), eMessageBox::iconInfo|eMessageBox::btOK);
532 debug.show();
533 debug.exec();
534 debug.hide();
536 searchSwapLight();
538 else
540 eMessageBox debug(eString().sprintf("%s\n%s",_("File has not been deleted due to an error!"),strerror(errno)), _("Swap Manager"), eMessageBox::iconWarning|eMessageBox::btOK);
541 debug.show();
542 debug.exec();
543 debug.hide();
547 eSwapManager::~eSwapManager()
549 if (createSwapfile)
550 delete createSwapfile;
552 #endif
553 #endif