Added program arguments to print labels in console mode

git-svn-id: https://svn.code.sf.net/p/qlscribe/svn/trunk@65 cac9541e-1b8d-4bfa-827e-589bba606050
This commit is contained in:
ruglory
2009-02-16 00:56:11 +00:00
parent 86d1abdfbd
commit 9b15a68c99
16 changed files with 277 additions and 32 deletions
+119 -15
View File
@@ -20,34 +20,138 @@
#include <QApplication>
#include <QMessageBox>
#include <QMap>
#include "mainwindow.h"
#include "qcdscene.h"
#include "qlightscribe.h"
#include "qconsoleprintprogress.h"
#include <iostream>
uid_t realUserId;
int main(int argc, char **argv)
std::ostream &operator<<( std::ostream &os, const QString &str )
{
QApplication app(argc, argv);
return os << str.toAscii().data();
}
void usage()
{
std::cout << "Usage: \n"
<< "To run GUI: qlscribe [filename] [filename] ...\n"
<< "To print label in console mode: qlscribe --print [--drive Index] [--replace KEY=VALUE] filename\n"
<< "\tParameters:\n"
<< "\t\t--help | -h - print this message\n"
<< "\t\t--print | -p - switch to print mode\n"
<< "\t\t--drive | -d NUMBER - use this drive, starts from 0, 0 is default\n"
<< "\t\t--replace | -r KEY=VALUE - replace text from KEY to VALUE\n"
<< std::endl;
}
int main( int argc, char **argv )
{
QApplication app( argc, argv );
app.addLibraryPath( "/usr/lib32/qt4/plugins" );
bool doPrint = false;
QStringList arguments = app.arguments();
QStringList files;
QCDScene::QString2String replacements;
int driveIndex = 0;
QLightScribe::PrintParameters params;
bool labelModeOverriden = false;
for( int i = 1; i < arguments.size(); ++i ) {
QString arg = arguments[i];
if( arg == "--print" || arg == "-p" ) {
doPrint = true;
continue;
}
if( arg == "--help" || arg == "-h" ) {
usage();
return 0;
}
if( arg == "--replace" || arg == "-r" ) {
if( i == arguments.size() - 1 ) {
std::cerr << "Error: arg#" << i
<< " argument expected for \"" << arg << "\" not enough parameters" << std::endl;
return 1;
}
QString param = arguments[ ++i ];
int pos = param.indexOf( '=' );
if( pos == -1 ) {
std::cerr << "Error: arg#" << i
<< " invalid argument for replacement, KEY=VALUE expected, missing =" << std::endl;
return 2;
}
replacements[ param.left( pos ) ] = param.right( param.size() - pos - 1 );
continue;
}
if( arg[0] != '-' )
files.append( arg );
}
if( doPrint && files.size() != 1 ) {
if( files.size() )
std::cerr << "Error: only one filename expected to print, got " << files.size() << " instead" << std::endl;
else
std::cerr << "Error: filename required to print" << std::endl;
return 3;
}
bool enablePrint = false;
if( geteuid() ) {
if( QMessageBox::question( 0,
QObject::tr( "Confirmation" ),
QObject::tr( "Print functionality requires setuid (sticky) flag set on the application\n"
"This program does not seem to have it set, print functiionality will be disabled\n"
"You still will be able to do print preview and edit documents\n"
"Do you want to continue?" ),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No )
== QMessageBox::No )
return 1;
if( !doPrint ) {
if( QMessageBox::question( 0,
QObject::tr( "Confirmation" ),
QObject::tr( "Print functionality requires setuid (sticky) flag set on the application\n"
"This program does not seem to have it set, print functionality will be disabled\n"
"You still will be able to do print preview and edit documents\n"
"Do you want to continue?" ),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No )
== QMessageBox::No )
return 4;
} else {
std::cerr << "Error: setuid flag is not set, cannot print" << std::endl;
return 4;
}
} else {
realUserId = getuid();
setreuid( 0, realUserId );
enablePrint = true;
}
MainWindow mwindow( enablePrint );
mwindow.show();
return app.exec();
int rez = 0;
if( doPrint ) {
// print here
QCDScene scene;
QString err;
if( !scene.load( files.front(), &err ) ) {
std::cerr << "Error: cannot read \"" << files.front() << "\" - " << err << std::endl;
return 5;
}
scene.replace( replacements );
if( !labelModeOverriden )
params.m_labelMode = scene.labelMode();
QLightScribe *scribe = QLightScribe::instance();
QList< QLightDrive * > drives = scribe->getDrives();
if( driveIndex >= drives.size() ) {
std::cerr << "Error: drive " << driveIndex << " but there are only " << drives.size() << " drives" << std::endl;
return 6;
}
QConsolePrintProgress progress;
std::cout << "Printing label " << files.front() << std::endl;
scribe->print( drives[driveIndex], params, &scene );
rez = app.exec();
} else {
MainWindow mwindow( enablePrint );
mwindow.show();
mwindow.open( files );
rez = app.exec();
}
return rez;
}