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.
24 #include <swapmanager.h>
29 eSwapManager::eSwapManager(): eWindow(0), createSwapfile(0)
32 cmove(ePoint(100,120));
33 cresize(eSize(500, 370));
34 setText(_("Swap Manager"));
37 statusbar
=new eStatusBar(this);
38 statusbar
->move( ePoint(0, clientrect
.height()-50 ) );
39 statusbar
->resize( eSize( clientrect
.width(), 50) );
40 statusbar
->loadDeco();
44 //Boxmodell for hdd-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));
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"));
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")
84 else if (file
== "myswap")
88 else if (file
== "swap")
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));
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()))
124 else if(path
== hdddir
)
128 else if(path
== eString().sprintf("%scf/",mntbase
.c_str()))
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));
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
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();
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();
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();
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();
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
234 void eSwapManager::getBoxType()
236 int boxtype
= eSystemInfo::getInstance()->getHwType();
240 case eSystemInfo::DM500
:
241 case eSystemInfo::DM5600
:
242 case eSystemInfo::DM5620
:
243 case eSystemInfo::TR_DVB272S
:
244 case eSystemInfo::DM7000
:
247 mntbase
= "/var/mnt/";
249 case eSystemInfo::DM500PLUS
:
250 case eSystemInfo::DM600PVR
:
251 case eSystemInfo::DM7020
:
252 hdddir
= "/media/hdd/";
259 //Abfragen der aktuell aktiven Swaps
260 void eSwapManager::getCurrentSwaps()
264 char swapbuffer
[150];
266 FILE *j
= fopen("/proc/swaps", "r");
269 while(fgets(swapbuffer
, 75, j
))
272 dummystring
= swapbuffer
;
273 std::stringstream tmp
;
274 tmp
.str(dummystring
);
276 swaps
[s
] = dummystring
;
283 //Aktiv/Inaktiv abfragen
284 void eSwapManager::getState()
290 for(int m
=0; m
< s
; m
++)
292 if(swaps
[m
] == store
)
301 void eSwapManager::getSize()
304 eString tmp
= cb_mnt
->getCurrent()->getText() + cb_file
->getCurrent()->getText();
309 if (stat(tmp
.c_str(), &sw
) != -1)
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);
321 void eSwapManager::setButtons()
329 found
= eString().sprintf(_("Not found"));
330 status
= eString().sprintf(_("Inactive"));
332 else if(swapfound
== 1 && swapstatus
== 0)
338 found
= eString().sprintf(_("Found"));
339 status
= eString().sprintf(_("Inactive"));
341 else if(swapfound
== 1 && swapstatus
== 1)
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();
361 if (lstat(store
.c_str(),&st
) != -1)
375 //Swapfile suchen (ohne Listbox)
376 void eSwapManager::searchSwapLight()
378 store
= cb_mnt
->getCurrent()->getText() + cb_file
->getCurrent()->getText();
380 if (lstat(store
.c_str(),&st
) != -1)
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);
405 eString command
= eString().sprintf("dd if=/dev/zero of=%s bs=1024 count=%d", store
.c_str(), bytesize
);
409 createSwapfile
= new eConsoleAppContainer(command
.c_str());
410 CONNECT(createSwapfile
->appClosed
, eSwapManager::appClosed
);
416 void eSwapManager::appClosed(int)
418 delete createSwapfile
;
421 int byte
=(int)cb_size
->getCurrent()->getKey();
423 eString tmp
= cb_mnt
->getCurrent()->getText() + cb_file
->getCurrent()->getText();
428 if (stat(tmp
.c_str(), &crsize
) != -1)
429 created
=crsize
.st_size
;
430 created
/=(1024*1024);
436 eMessageBox
debug((eString().sprintf(_("The swapfile has been created!"))), _("Swap Manager"), eMessageBox::btOK
);
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)
447 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue
);
452 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue
);
457 eMessageBox
debug((eString().sprintf("%s\n%s",_("There has been an error during creation!"),strerror(errno
))), _("Swap Manager"), eMessageBox::iconWarning
|eMessageBox::btOK
);
466 //Swapfile aktivieren
467 void eSwapManager::activateSwap()
469 store
= cb_mnt
->getCurrent()->getText() + cb_file
->getCurrent()->getText();
471 eConfig::getInstance()->getKey("/extras/mkswap", mkvalue
);
474 if( system(eString().sprintf("mkswap %s", store
.c_str() ).c_str()) == 0)
477 eConfig::getInstance()->setKey("/extras/mkswap", mkvalue
);
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);
495 eMessageBox
debug((eString().sprintf("%s\n%s",_("Error during activation!"),strerror(errno
))), _("Swap Manager"), eMessageBox::iconWarning
|eMessageBox::btOK
);
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);
518 eMessageBox
debug((eString().sprintf("%s\n%s",_("Error during inactivation!"),strerror(errno
))), _("Swap Manager"), eMessageBox::iconWarning
|eMessageBox::btOK
);
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
);
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
);
547 eSwapManager::~eSwapManager()
550 delete createSwapfile
;