Tuesday, March 24, 2009

Linux - Receiving daemon messages in your Mail Client Inbox

Daemon messages in Linux are mailed to the superuser. The good old command line utility mail always rocks to access these messages. But what if you wanted to receive these messages in your default mail client inbox and access them via GUI? The steps are really easy. I will show you how to do this configuring Thunderbird as my default mail client.

1. Download Mozilla Thunderbird on your Linux box.(The package will have a name like thunderbird.tar.gz)

2. Unzip the package using the following commands:
gunzip thunderbird.tar.gz

tar -xvf thunderbird.tar

3. Move thunderbird directory to the /opt directory.

4. Goto the /opt directory and run the application
cd /opt
./thunderbird

5. Follow the account setup instructions as shown:









(assuming you are root on the machine free.scoobydoo)








6. Click Finish and we are all set to go. The daemon messages from now onwards will be available in your inbox. Thunderbird will retrieve them from the system mbox, whenever it is started.

QSqlDatabase closing problem while using QSqlTableModel with QTableView

Problem:

I was working on a application that deals with multiple databases when I encountered a problem while closing a connection. Even if I close the connection it seemed to be active and hence was not letting itself to be copied.
The code I used typically was :

QSqlDatabase db(Conn);

....................................
....................................

....................................
db.close();



The copying problem caused due to the connection remaining active got solved after enclosing the queries in proper scope. eg.

{
QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct

But the problem reappeared, after I implemented a QTableView with a QSqlTableModel:

QSqlTableModel *model =new QSqlTableModel(this, Conn) ;
model->setTable("student");
model->setFilter("student_id=" +QString::number(Cmn_Global::student_id ));
model->setSort(3, Qt::AscendingOrder);
model->setEditStrategy(QSqlTableModel:: OnFieldChange);
model->select();
............................
...........................
ui.tableView->setModel(model);//view is the QTableView object

Calling db.close() failed to close the connection as the real time querying between the Model and the View, which was not possible for me to enclose within scope.


Solution:
The only solution that emerged was to kill the connection manually, by deleting the QSqlTableModel pointer related to the view using the following code:
QSqlTableModel* model= dynamic_cast (ui.tableView->model());
delete model;

And then calling the close method on the database.

The database can then be smoothly copied as the connection was no more active.

Wednesday, March 4, 2009

Word Wrap Code

This is a code to wrap a QString if it exceeds a particular number of characters per line, without splitting any word into different lines.

Signature : QString wordWrap(const QString &str, int wrapLength)
Argument : 1. The QString to be wrapped
2. The permissible number of characters per line.

Return Value: The wrapped QString

QString wordWrap(const QString &str, int wrapLength)
{
QString tempStr= str;
int len = str.length(), pos= (wrapLength>1)?wrapLength -1:1;

while(pos < len-1){

int tempPos=pos;
while(tempStr.at(tempPos)!=' ' && tempPos > 0){

tempPos--;
}
if(tempPos > 0)pos=tempPos;

tempStr.replace(pos,1,'\n');
pos+=pos;
}

return tempStr;
}

Directory Copy code

This is a directory copy code . It copies all the files or subdirectories under the destination directory to the target directory:

Signature : void copyDir(QString, QString)
Argument : 1. Path of the source directory
2. Path of the destination directory (if the destination does not exist, it is created automatically)

Return Value: void

void copyDir(QString src, QString dest)
{
//Check whether the dir directory exists
if(QDir(src).exists()){
if(!QDir(dest).exists()){
QDir().mkpath(dest);
}

//Construct an iterator to get the entries in the directory
QDirIterator dirIterator(src);

while (dirIterator.hasNext()) {
QString item= dirIterator.next(), fileName= dirIterator.fileName();
QFileInfo fileInfo= dirIterator.fileInfo();

if(fileName!="." && fileName!=".."){

//If entry is a file copy it
if(fileInfo.isFile()){
QFile::copy(item, dest+"/"+ fileName);
}
//If entry is a directory, call the deltree function over it again to traverse it
else
copy(item, dest+ "/"+ fileName);
}
}
}else return;

}

Monday, March 2, 2009

Directory Tree Deletion Code (rmdir or rm -f equivalent)

This is a directory removal code (rm -r or rmdir equivalent). It deletes all the files or subdirectories under the directory pointed to and also deletes the directory itself:

Signature : bool delTree(QString)
Argument : Path of the directory to be deleted as QString
Return Value: true on success/false on error

bool delTree(QString dir)
{
//Check whether the dir directory exists
if(QDir(dir).exists()){

//Construct an iterator to get the entries in the directory
QDirIterator dirIterator(dir);

while (dirIterator.hasNext()) {

//Get the file information
QString item= dirIterator.next(), fileName= dirIterator.fileName();
QFileInfo fileInfo= dirIterator.fileInfo();

//If entry is a file delete it
if(fileName!="." && fileName!=".."){

if(fileInfo.isFile()){
QFile::remove(item);
}
//If entry is a directory, call the deltree function over it again to traverse it
else if(fileInfo.isDir()){
delTree(item);
}
}
}
}else
return false;

//Move up the directory hierarchy by one level
//Delete the current directory
QDir currentDir(dir);
currentDir.cdUp();
return currentDir.rmdir(dir);

}