2020-10-31 Fred Gleason <fredg@paravelsystems.com>

* Added an 'RDApplication::ExitCode'.
	* Implemented 'RDApplication::ExitCode' in rdimport(1).
	* Implemented 'RDApplication::ExitCode' in rdlogmanager(1).
	* Implemented 'RDApplication::ExitCode' in rdservice(8).

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason
2020-10-31 16:47:41 -04:00
parent b7702a9c79
commit 2aa5aea4f9
22 changed files with 814 additions and 148 deletions

View File

@@ -98,6 +98,7 @@ MainObject::MainObject(QObject *parent)
import_clear_dayparts=false;
import_xml=false;
import_to_mono=false;
import_failed_imports=0;
//
// Open the Database
@@ -105,7 +106,7 @@ MainObject::MainObject(QObject *parent)
rda=new RDApplication("rdimport","rdimport",RDIMPORT_USAGE,this);
if(!rda->open(&err_msg)) {
fprintf(stderr,"rdimport: %s\n",(const char *)err_msg);
exit(1);
exit(RDApplication::ExitNoDb);
}
//
@@ -113,7 +114,7 @@ MainObject::MainObject(QObject *parent)
//
if(rda->cmdSwitch()->keys()<2) {
Log(LOG_ERR,QString().sprintf("\n%s\n",RDIMPORT_USAGE));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
for(unsigned i=0;i<rda->cmdSwitch()->keys()-2;i++) {
if(rda->cmdSwitch()->key(i)=="--verbose") {
@@ -132,11 +133,11 @@ MainObject::MainObject(QObject *parent)
import_cart_number=rda->cmdSwitch()->value(i).toUInt(&ok);
if((!ok)||(import_cart_number<1)||(import_cart_number>999999)) {
Log(LOG_ERR,QString("rdimport: invalid cart number\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
if(import_use_cartchunk_cutid) {
Log(LOG_ERR,QString("rdimport: '--to-cart' and '--use-cartchunk-cutid' are mutually exclusive\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_single_cart=true;
rda->cmdSwitch()->setProcessed(i,true);
@@ -144,7 +145,7 @@ MainObject::MainObject(QObject *parent)
if(rda->cmdSwitch()->key(i)=="--use-cartchunk-cutid") {
if(import_cart_number!=0) {
Log(LOG_ERR,QString("rdimport: '--to-cart' and '--use-cartchunk-cutid' are mutually exclusive\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_use_cartchunk_cutid=true;
rda->cmdSwitch()->setProcessed(i,true);
@@ -153,7 +154,7 @@ MainObject::MainObject(QObject *parent)
import_cart_number_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid --cart-number-offset\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -173,7 +174,7 @@ MainObject::MainObject(QObject *parent)
import_startdate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid startdate-offset\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -181,7 +182,7 @@ MainObject::MainObject(QObject *parent)
import_enddate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid enddate-offset\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -193,42 +194,42 @@ MainObject::MainObject(QObject *parent)
QStringList f0=rda->cmdSwitch()->value(i).split(",");
if(f0.size()!=2) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
for(unsigned j=0;j<2;j++) {
if((f0[j].length()!=15)||(f0[j].mid(8,1)!="-")) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned year=f0[j].left(4).toUInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid year argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned month=f0[j].mid(4,2).toUInt(&ok);
if((!ok)||(month>12)) {
Log(LOG_ERR,QString("rdimport: invalid month argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned day=f0[j].mid(6,2).toUInt(&ok);
if((!ok)||(day>31)) {
Log(LOG_ERR,QString("rdimport: invalid day argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned hour=f0[j].mid(9,2).toUInt(&ok);
if((!ok)||(hour>23)) {
Log(LOG_ERR,QString("rdimport: invalid hour argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned min=f0[j].mid(11,2).toUInt(&ok);
if((!ok)||(min>59)) {
Log(LOG_ERR,QString("rdimport: invalid minute argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned sec=f0[j].right(2).toUInt(&ok);
if((!ok)||(sec>59)) {
Log(LOG_ERR,QString("rdimport: invalid seconds argument to --set-datetimes\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_datetimes[j]=QDateTime(QDate(year,month,day),
QTime(hour,min,sec));
@@ -238,7 +239,7 @@ MainObject::MainObject(QObject *parent)
}
if(import_datetimes[0]>=import_datetimes[1]) {
Log(LOG_ERR,QString("rdimport: datetime cannot end before it begins\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -246,33 +247,33 @@ MainObject::MainObject(QObject *parent)
QStringList f0=rda->cmdSwitch()->value(i).split(",");
if(f0.size()!=2) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-daypart-times\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
for(unsigned j=0;j<2;j++) {
if(f0[j].length()!=6) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-daypart-times\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned hour=f0[j].left(2).toUInt(&ok);
if((!ok)||(hour>23)) {
Log(LOG_ERR,QString("rdimport: invalid hour argument to --set-daypart-times\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned min=f0[j].mid(2,2).toUInt(&ok);
if((!ok)||(min>59)) {
Log(LOG_ERR,QString("rdimport: invalid minute argument to --set-daypart-times\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
unsigned sec=f0[j].right(2).toUInt(&ok);
if((!ok)||(sec>59)) {
Log(LOG_ERR,QString("rdimport: invalid seconds argument to --set-daypart-times\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_dayparts[j].setHMS(hour,min,sec);
}
if(import_dayparts[0]>=import_dayparts[1]) {
Log(LOG_ERR,QString("rdimport: daypart cannot end before it begins\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -303,7 +304,7 @@ MainObject::MainObject(QObject *parent)
import_metadata_pattern=rda->cmdSwitch()->value(i);
if(!VerifyPattern(import_metadata_pattern)) {
Log(LOG_ERR,QString("rdimport: invalid --metadata-pattern\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -311,7 +312,7 @@ MainObject::MainObject(QObject *parent)
import_output_pattern=rda->cmdSwitch()->value(i);
if(!VerifyPattern(import_output_pattern)) {
Log(LOG_ERR,QString("rdimport: invalid --output-pattern\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -323,7 +324,7 @@ MainObject::MainObject(QObject *parent)
import_persistent_dropbox_id=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid persistent dropbox id\n"));
exit(2);
exit(RDApplication::ExitNoDropbox);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -331,7 +332,7 @@ MainObject::MainObject(QObject *parent)
import_create_startdate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid create-startddate-offset\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_create_dates=true;
rda->cmdSwitch()->setProcessed(i,true);
@@ -341,7 +342,7 @@ MainObject::MainObject(QObject *parent)
if((!ok) ||
(import_create_startdate_offset > import_create_enddate_offset )) {
Log(LOG_ERR,QString("rdimport: invalid create-enddate-offset\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
import_create_dates=true;
rda->cmdSwitch()->setProcessed(i,true);
@@ -362,7 +363,7 @@ MainObject::MainObject(QObject *parent)
import_string_bpm=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid value for --set-string-bpm\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -401,7 +402,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,"invalid ISRC \""+rda->cmdSwitch()->value(i)+"\"\n");
exit(1);
exit(RDApplication::ExitInvalidOption);
}
}
if(rda->cmdSwitch()->key(i)=="--set-string-recording-mbid") {
@@ -423,7 +424,7 @@ MainObject::MainObject(QObject *parent)
if(rda->cmdSwitch()->key(i)=="--set-string-title") {
if(rda->cmdSwitch()->value(i).isEmpty()) {
Log(LOG_ERR,QString("rdimport: title field cannot be empty\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
import_string_title=rda->cmdSwitch()->value(i);
rda->cmdSwitch()->setProcessed(i,true);
@@ -436,7 +437,7 @@ MainObject::MainObject(QObject *parent)
import_string_year=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid value for --set-string-year\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -451,19 +452,19 @@ MainObject::MainObject(QObject *parent)
//
if(import_datetimes[0].isValid()&&import_clear_datetimes) {
Log(LOG_ERR,QString("rdimport: --set-datetimes and --clear-datetimes are mutually exclusive\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
if((!import_dayparts[1].isNull())&&import_clear_dayparts) {
Log(LOG_ERR,QString("rdimport: --set-daypart-times and --clear-daypart-times are mutually exclusive\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
if((!import_metadata_pattern.isEmpty())&&import_xml) {
Log(LOG_ERR,QString().sprintf("rdimport: --metadata-pattern and --xml are mutually exclusive\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
if((!import_log_filename.isEmpty())&&import_log_syslog) {
Log(LOG_ERR,QString().sprintf("rdimport: --log-filename and --log-syslog are mutually exclusive\n"));
exit(255);
exit(RDApplication::ExitInvalidOption);
}
import_cut_markers=new MarkerSet();
@@ -495,7 +496,7 @@ MainObject::MainObject(QObject *parent)
if(!import_group->exists()) {
Log(LOG_ERR,QString().sprintf("rdimport: invalid group specified\n"));
delete import_group;
exit(2);
exit(RDApplication::ExitNoGroup);
}
import_file_key=i+1;
i=rda->cmdSwitch()->keys();
@@ -509,7 +510,7 @@ MainObject::MainObject(QObject *parent)
if(!import_group->cartNumberValid(import_cart_number)) {
Log(LOG_ERR,QString().sprintf("rdimport: invalid cart number for group\n"));
delete import_group;
exit(2);
exit(RDApplication::ExitInvalidCart);
}
}
@@ -520,7 +521,7 @@ MainObject::MainObject(QObject *parent)
if(!SchedulerCodeExists(import_add_scheduler_codes[i])) {
Log(LOG_ERR,QString().sprintf("rdimport: scheduler code \"%s\" does not exist\n",
(const char *)import_add_scheduler_codes[i].toUtf8()));
exit(2);
exit(RDApplication::ExitNoSchedCode);
}
}
@@ -545,7 +546,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid normalization level\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -556,7 +557,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid autotrim level\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -567,7 +568,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid segue level\n"));
exit(2);
exit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@@ -852,7 +853,7 @@ void MainObject::userData()
Log(LOG_INFO,QString("rdimport finished\n"));
exit(0);
NormalExit();
}
@@ -971,7 +972,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
delete wavedata;
delete effective_group;
if(!import_run) {
exit(0);
NormalExit();
}
if(!import_temp_fix_filename.isEmpty()) {
// printf("Fixed Name: %s\n",(const char *)import_temp_fix_filename);
@@ -991,7 +992,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
delete wavedata;
delete effective_group;
if(!import_run) {
exit(0);
NormalExit();
}
if(!import_temp_fix_filename.isEmpty()) {
QFile::remove(import_temp_fix_filename);
@@ -1056,7 +1057,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
delete effective_group;
if(import_drop_box) {
if(!import_run) {
exit(0);
NormalExit();
}
if(!import_temp_fix_filename.isEmpty()) {
QFile::remove(import_temp_fix_filename);
@@ -1146,7 +1147,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
delete wavedata;
delete effective_group;
if(!import_run) {
exit(0);
NormalExit();
}
if(!import_temp_fix_filename.isEmpty()) {
QFile::remove(import_temp_fix_filename);
@@ -1357,7 +1358,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
Log(LOG_INFO,QString().sprintf(" Deleted file \"%s\"\n",(const char *)RDGetBasePart(filename).toUtf8()));
}
if(!import_run) {
exit(0);
NormalExit();
}
if(!import_temp_fix_filename.isEmpty()) {
QFile::remove(import_temp_fix_filename);
@@ -2166,6 +2167,15 @@ void MainObject::Log(int prio,const QString &msg) const
}
void MainObject::NormalExit() const
{
if(import_failed_imports>0) {
exit(RDApplication::ExitImportFailed);
}
exit(RDApplication::ExitOk);
}
int main(int argc,char *argv[])
{
QApplication a(argc,argv,false);

View File

@@ -74,6 +74,7 @@ class MainObject : public QObject
void ReadXmlFile(const QString &basename,RDWaveData *wavedata) const;
void Log(int prio,const QString &msg) const;
void SendNotification(RDNotification::Action action,unsigned cartnum);
void NormalExit() const;
unsigned import_file_key;
RDGroup *import_group;
bool import_verbose;
@@ -134,6 +135,7 @@ class MainObject : public QObject
QString import_string_title;
QString import_string_user_defined;
int import_string_year;
int import_failed_imports;
struct DropboxList {
QString filename;
unsigned size;