2017-12-27 Fred Gleason <fredg@paravelsystems.com>

* Added log locking logic to rdairplay(1).
This commit is contained in:
Fred Gleason
2017-12-27 15:01:32 -05:00
parent afa98a737f
commit f624114e60
13 changed files with 185 additions and 15 deletions

View File

@@ -18,6 +18,7 @@
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <qmessagebox.h>
#include <qpushbutton.h>
#include <rdadd_log.h>
@@ -121,10 +122,11 @@ QSizePolicy ListLogs::sizePolicy() const
}
int ListLogs::exec(QString *logname,QString *svcname)
int ListLogs::exec(QString *logname,QString *svcname,RDLogLock **log_lock)
{
list_logname=logname;
list_svcname=svcname;
list_log_lock=log_lock;
list_saveas_button->setEnabled(rduser->createLog());
QStringList services_list;
QString sql=QString("select SERVICE_NAME from SERVICE_PERMS where ")+
@@ -149,7 +151,7 @@ void ListLogs::filterChangedData(const QString &where_sql)
void ListLogs::closeEvent(QCloseEvent *e)
{
done(1);
done(ListLogs::Cancel);
}
@@ -166,7 +168,8 @@ void ListLogs::loadButtonData()
return;
}
*list_logname=item->text(0);
done(0);
*list_log_lock=NULL;
done(ListLogs::Load);
}
@@ -176,7 +179,20 @@ void ListLogs::saveButtonData()
saveAsButtonData();
}
else {
done(2);
*list_log_lock=new RDLogLock(*list_logname,rduser,rdstation_conf,this);
if(!TryLock(*list_log_lock)) {
delete *list_log_lock;
*list_log_lock=NULL;
return;
}
if(list_log->isRefreshable()) {
QMessageBox::warning(this,"RDAirPlay - "+tr("Error"),
tr("You must refresh the log before it can be saved."));
delete *list_log_lock;
*list_log_lock=NULL;
return;
}
done(ListLogs::Save);
}
}
@@ -188,7 +204,6 @@ void ListLogs::saveAsButtonData()
RDAddLog *log;
log=new RDAddLog(&logname,&svcname,RDLogFilter::StationFilter,rduser,
rdstation_conf,tr("Rename Log"),this);
if(log->exec()<0) {
delete log;
return;
@@ -196,19 +211,21 @@ void ListLogs::saveAsButtonData()
delete log;
*list_logname=logname;
*list_svcname=svcname;
done(3);
done(ListLogs::SaveAs);
}
void ListLogs::unloadButtonData()
{
done(-1);
*list_log_lock=NULL;
done(ListLogs::Unload);
}
void ListLogs::cancelButtonData()
{
done(1);
*list_log_lock=NULL;
done(ListLogs::Cancel);
}
@@ -252,3 +269,22 @@ void ListLogs::RefreshList()
}
delete q;
}
bool ListLogs::TryLock(RDLogLock *lock)
{
QString username;
QString stationname;
QHostAddress addr;
if(!lock->tryLock(&username,&stationname,&addr)) {
QString msg=tr("Log already being edited by")+" "+username+"@"+stationname;
if(stationname!=addr.toString()) {
msg+=" ["+addr.toString()+"]";
}
msg+=".";
QMessageBox::warning(this,"RDAirPlay - "+tr("Log Locked"),msg);
return false;
}
return true;
}