Source Code (Use browser search to find items of interest.)
Class Index
kscd'CDDialog (./kdemultimedia/kscd/CDDialog.h:39)
class CDDialog : public CDDialogData
{
Q_OBJECT
public:
CDDialog
(
QWidget* parent = NULL,
const char* name = NULL
);
virtual ~CDDialog();
void setData(
struct cdinfo_wm *cd,
QStrList& tracktitlelist,
QStrList& extlist,
QStrList& discidlist,
QString& xmcddata,
QString& cat,
int& revision,
QStrList& playlist,
QStrList& pathlist,
QString& _mailcmd,
QString& _submitaddress,
SMTPConfig::SMTPConfigData *_smtpConfigData
);
bool checkit();
void save_cddb_entry(QString& path,bool upload);
void getCategoryFromPathName(char* pathname, QString& _category);
protected:
void closeEvent(QCloseEvent* e);
void keyPressEvent(QKeyEvent* e);
public slots:
void titleselected(int);
void titlechanged(const QString &);
void trackchanged();
void save();
void extITB();
void extIB();
void load();
void upload();
void ok();
void play(int i);
signals:
void cddb_query_signal(bool);
void dialog_done();
void play_signal(int i);
private:
SMTPConfig::SMTPConfigData *smtpConfigData;
QStrList ext_list;
QStrList track_list;
QStrList pathlist;
QStrList playlist;
QString xmcd_data;
QStrList discidlist;
int revision;
QString submitaddress;
QString category;
QString mailcmd;
QString playorder;
struct dialogcdinfo cdinfo;
bool messageNotSent;
};
kscd'CDDialog::CDDialog() (./kdemultimedia/kscd/CDDialog.cpp:61)
CDDialog::CDDialog
(
QWidget* parent,
const char* name
)
:
Inherited( parent, name )
{
setCaption( i18n("CD Database Editor") );
cdinfo.magicID = 0; /*cddb magic disk id BERND*/
cdinfo.ntracks = 0; /* Number of tracks on the disc */
cdinfo.length = 0; /* Total running time in seconds */
cdinfo.cddbtoc = 0L;
connect(listbox, SIGNAL(highlighted(int)),this,SLOT(titleselected(int)));
connect(listbox, SIGNAL(selected(int)),this,SLOT(play(int)));
connect(trackedit, SIGNAL(returnPressed()) ,this,SLOT(trackchanged()));
connect(save_button, SIGNAL(clicked()) ,this,SLOT(save()));
connect(upload_button, SIGNAL(clicked()) ,this,SLOT(upload()));
connect(ok_button, SIGNAL(clicked()) ,this,SLOT(ok()));
connect(load_button, SIGNAL(clicked()) ,this,SLOT(load()));
connect(ext_info_title_button, SIGNAL(clicked()) ,this,SLOT(extITB()));
connect(ext_info_button, SIGNAL(clicked()) ,this,SLOT(extIB()));
connect(titleedit, SIGNAL(textChanged(const QString &)),
this,SLOT(titlechanged(const QString &)));
ext_info_button->setEnabled(false);
setFixedSize(width(),height());
} // CDDialog
kscd'CDDialog::~CDDialog() (./kdemultimedia/kscd/CDDialog.cpp:95)
CDDialog::~CDDialog()
{
if(cdinfo.cddbtoc)
delete [] cdinfo.cddbtoc;
} // ~CDDialog
void
kscd'CDDialog::closeEvent() (./kdemultimedia/kscd/CDDialog.cpp:102)
CDDialog::closeEvent(QCloseEvent*)
{
emit dialog_done();
} // closeEvent
void
kscd'CDDialog::keyPressEvent() (./kdemultimedia/kscd/CDDialog.cpp:108)
CDDialog::keyPressEvent(QKeyEvent *e)
{
if(e->state() == 0 && e->key() == Key_Escape)
emit dialog_done();
} // keyPressEvent
void
kscd'CDDialog::ok() (./kdemultimedia/kscd/CDDialog.cpp:115)
CDDialog::ok()
{
emit dialog_done();
} // ok
void
kscd'CDDialog::play() (./kdemultimedia/kscd/CDDialog.cpp:121)
CDDialog::play(int i)
{
emit play_signal(i);
} // play
void
kscd'CDDialog::setData() (./kdemultimedia/kscd/CDDialog.cpp:128)
CDDialog::setData(
struct cdinfo_wm *cd,
QStrList& tracktitlelist,
QStrList& extlist,
QStrList& discidl,
QString& _xmcd_data,
QString& cat,
int& rev,
QStrList& _playlist,
QStrList& _pathlist,
QString& _mailcmd,
QString& _submitaddress,
SMTPConfig::SMTPConfigData *_smtpConfigData
)
{
int ntr, etr;
ext_list = extlist;
track_list = tracktitlelist;
xmcd_data = _xmcd_data.copy();
category = cat.copy();
discidlist = discidl;
revision = rev;
playlist = _playlist;
pathlist = _pathlist;
mailcmd = _mailcmd.copy();
submitaddress = _submitaddress.copy();
smtpConfigData = _smtpConfigData;
ntr = track_list.count();
etr = ext_list.count();
// Let's make a deep copy of the cd struct info so that the data won't
// change the cd changes while we are playing with the dialog.
// put one of these into the destructor too..
if(cdinfo.cddbtoc)
delete [] cdinfo.cddbtoc;
cdinfo.cddbtoc = new struct mytoc [cd->ntracks + 2];
cdinfo.magicID = cd->magicID; /* cddb magic disk id */
cdinfo.ntracks = cd->ntracks; /* Number of tracks on the disc */
cdinfo.length = cd->length; /* Total running time in seconds */
for( int i = 0; i < cd->ntracks + 1; i++)
{
cdinfo.cddbtoc[i].min = cd->cddbtoc[i].min;
cdinfo.cddbtoc[i].sec = cd->cddbtoc[i].sec;
cdinfo.cddbtoc[i].frame = cd->cddbtoc[i].frame;
cdinfo.cddbtoc[i].absframe = cd->cddbtoc[i].absframe;
}
// some sanity provisions
if((int)track_list.count() < cdinfo.ntracks + 1)
{
int k = track_list.count();
for(int i = 0 ; i < (int)( cdinfo.ntracks + 1 - k) ; i ++)
{
track_list.append("");
}
}
if((int)ext_list.count() < cdinfo.ntracks + 1)
{
int l = ext_list.count();
for(int i = 0 ; i < (int) ( cdinfo.ntracks + 1 - l) ; i ++)
{
ext_list.append("");
}
}
while((int)track_list.count() > cdinfo.ntracks + 1)
{
track_list.remove(track_list.count() - 1);
}
while((int)ext_list.count() > cdinfo.ntracks + 1)
{
ext_list.remove(ext_list.count() - 1);
}
titleedit->setText(track_list.at(0));
QString idstr;
idstr.sprintf("%08lx",cd->magicID);
idstr = category + (QString("\n") + idstr);
if(cdinfo.ntracks > 0)
disc_id_label->setText(idstr);
else
disc_id_label->setText("");
QTime dl;
dl = dl.addSecs(cdinfo.length);
QString temp2;
if(dl.hour() > 0)
temp2.sprintf(i18n("Total Time:\n%02d:%02d:%02d").ascii(),dl.hour(),dl.minute(),dl.second());
else
temp2.sprintf(i18n("Total Time:\n %02d:%02d").ascii(),dl.minute(),dl.second());
total_time_label->setText(temp2);
QString fmt;
QTime dml;
listbox->setAutoUpdate(false);
listbox->clear();
for(int i = 1; i <= cdinfo.ntracks; i++)
{
dml = framestoTime(cdinfo.cddbtoc[i].absframe - cdinfo.cddbtoc[i-1].absframe);
if((ntr >= i) && (ntr > 0))
{
fmt.sprintf("%02d %02d:%02d %s",i,
dml.minute(),dml.second(),track_list.at(i));
} else {
fmt.sprintf("%02d %02d:%02d",i,dml.minute(),dml.second());
}
listbox->insertItem(fmt,-1);
}
listbox->setAutoUpdate(true);
listbox->repaint();
QString str;
cddb_playlist_encode(playlist,str);
progseq_edit->setText(str);
} // setData
void
kscd'CDDialog::extIB() (./kdemultimedia/kscd/CDDialog.cpp:264)
CDDialog::extIB()
{
int item;
item = listbox->currentItem();
if(item == -1)
return;
InexactDialog *dialog;
dialog = new InexactDialog(0,"dialog",false);
dialog->setTitle(i18n("Use this Editor to annotate this track"));
dialog->insertText(ext_list.at(item + 1));
if(dialog->exec() != QDialog::Accepted)
{
delete dialog;
return;
}
QString text;
dialog->getSelection(text);
// ext_list.insert( item, text );
ext_list.remove(item + 1);
ext_list.insert(item + 1, text.ascii());
delete dialog;
} // extIB
void
kscd'CDDialog::extITB() (./kdemultimedia/kscd/CDDialog.cpp:295)
CDDialog::extITB()
{
InexactDialog *dialog;
dialog = new InexactDialog(0,"dialog",false);
dialog->insertText(ext_list.at(0));
dialog->setTitle(i18n("Use this Editor to annotate the title"));
if(dialog->exec() != QDialog::Accepted)
{
delete dialog;
return;
}
QString text;
dialog->getSelection(text);
ext_list.insert( 0 , text.ascii() );
ext_list.remove( 1 );
delete dialog;
} // extITB
kscd'CDDialog::titleselected() (./kdemultimedia/kscd/CDDialog.cpp:317)
void CDDialog::titleselected(int i)
{
ext_info_button->setEnabled(true);
if(i + 1 < (int)track_list.count())
trackedit->setText(track_list.at(i+1));
} // titleselected
void
kscd'CDDialog::trackchanged() (./kdemultimedia/kscd/CDDialog.cpp:325)
CDDialog::trackchanged()
{
int i;
i = listbox->currentItem();
if (i == -1)
return;
QTime dml = framestoTime(cdinfo.cddbtoc[i+1].absframe - cdinfo.cddbtoc[i].absframe);
QString fmt;
fmt.sprintf("%02d %02d:%02d %s",i+1,dml.minute(),dml.second(),trackedit->text().ascii());
track_list.insert(i+1,trackedit->text().ascii());
track_list.remove(i+2);
listbox->setAutoUpdate(false);
listbox->insertItem(fmt, i);
listbox->removeItem(i+1);
listbox->setAutoUpdate(true);
listbox->repaint();
if ( i <(int) listbox->count() -1 )
{
listbox->setCurrentItem(i+1);
listbox->centerCurrentItem();
}
} // trackchanged
QTime
kscd'CDDialog::titlechanged() (./kdemultimedia/kscd/CDDialog.cpp:381)
CDDialog::titlechanged(const QString &t)
{
track_list.remove((uint)0);
track_list.insert(0, t.ascii());
} // titlechanged
kscd'CDDialog::upload() (./kdemultimedia/kscd/CDDialog.cpp:390)
CDDialog::upload()
{
if(!checkit())
return;
/*
switch( KMessageBox::information( this,
i18n(
"The submission you are about to make will go to the test server\n"\
"cddb-test@cddb.com. This is because this is the first release of\n"\
"the cddb addition to Kscd and I need to avoid corruption\n"\
"of the remote cddb data bases due to possible bugs in Kscd.\n"\
"Since we need about a 100 error free test submissions\n"\
"before we will be granted write acces to the 'true' cddb databases,
I would like you ask you to upload as many test submissions as possible.\n"\
"You don't need to try to find a CD that is not in the database \n"\
"(thought that would be helpful),it suffices to submit existing\n"\
"entries with Kscd.\n"\
"After submission you should receive a mail notifying you of success or\n"\
"or failure of your submission. Should you receive a failure notice\n"\
"please forward the failure report to me: <wuebben@kde.org>\n"\
"Check back often for the availablity of a fully enabled version of kscd.\n"\
"Thank you for your support.\n"),
i18n("OK"),
i18n("Cancel"),
0,
1 ) ){
case 0:
break;
case 1:
return;
break;
}
*/
InexactDialog *dialog;
dialog = new InexactDialog(0,"Dialog",true);
QStrList catlist;
catlist.append("rock");
catlist.append("classical");
catlist.append("jazz");
catlist.append("soundtrack");
catlist.append("newage");
catlist.append("blues");
catlist.append("folk");
catlist.append("country");
catlist.append("reggae");
catlist.append("misc");
catlist.append("data");
dialog->insertList(catlist);
dialog->setErrorString(i18n("Please select a Category or press Cancel"));
dialog->setTitle(i18n("To which category does the CD belong?"));
if(dialog->exec() != QDialog::Accepted)
{
delete dialog;
return;
}
dialog->getSelection(submitcat);
delete dialog;
QString tempfile;
tempfile = tmpnam(0L);
save_cddb_entry(tempfile,true);
kapp->processEvents();
kapp->flushX();
/* QString subject;
subject.sprintf("cddb %s %08x",submitcat.data(),cdinfo.magicID);
QString formatstr;
// formatstr = mailcmd + " cddb-test@cddb.cddb.com";
formatstr = mailcmd;
formatstr += " ";
formatstr += submitaddress;
*/
if(smtpConfigData->enabled)
{
debug("Submitting cddb entry via SMTP...\n");
QFile file(tempfile);
file.open(IO_ReadOnly);
QTextStream ti(&file);
QString s;
QString subject;
while (!ti.eof()){
s += ti.readLine() + "\r\n";
// if(!ti.eof()){
// mimetranslate(s);
// to << s. << '\n';
// }
}
// smtpMailer = new SMTP;
smtpMailer->setServerHost(smtpConfigData->serverHost);
smtpMailer->setPort(smtpConfigData->serverPort.toUInt());
smtpMailer->setSenderAddress(smtpConfigData->senderAddress);
smtpMailer->setRecipientAddress(submitaddress);
subject.sprintf("cddb %s %08lx", submitcat.data(), cdinfo.magicID);
smtpMailer->setMessageSubject(subject);
smtpMailer->setMessageBody(s);
smtpMailer->sendMessage();
return;
}
QString cmd;
// cmd = cmd.sprintf("mail -s \"%s\" cddb-test@cddb.cddb.com",subject.data());
// cmd = cmd.sprintf("sendmail wuebben@math.cornell.edu");
cmd = "sendmail -tU";
// cmd = cmd.sprintf(formatstr.data(),subject.data());
debug("Submitting cddb entry: %s\n",cmd.ascii());
FILE* mailpipe;
mailpipe = popen(cmd.data(),"w");
if(mailpipe == NULL){
QString str;
str = i18n("Could not pipe contents into:\n %1").arg(cmd);
KMessageBox::error(this, str);
pclose(mailpipe);
return;
}
QFile file(tempfile);
// QFile file2("/home/wuebben/test.txt"); // ******
file.open(IO_ReadOnly);
//file2.open(IO_ReadWrite); // ******
QTextStream ti(&file);
//QTextStream to(&file2); // ******
QTextStream to(mailpipe,IO_WriteOnly );
QString s;
//to << "Content-Transfer-Encoding: quoted-printable\n";
while ( !ti.eof() )
{
s = ti.readLine();
if(!ti.eof())
{
// mimetranslate(s);
to << s << '\n';
}
}
pclose(mailpipe);
file.close();
// file2.close(); // *****
unlink(tempfile.data());
debug("DONE SENDING\n");
} // upload
void
kscd'CDDialog::getCategoryFromPathName() (./kdemultimedia/kscd/CDDialog.cpp:569)
CDDialog::getCategoryFromPathName(char* pathname, QString& _category)
{
QString path = pathname;
path = path.stripWhiteSpace();
while(path.right(1) == QString("/"))
{
path = path.left(path.length() - 1);
}
int pos = 0;
pos = path.findRev("/",-1,true);
if(pos == -1)
_category = path.copy();
else
_category = path.mid(pos+1,path.length());
} // getCategoryFromPathName
void
kscd'CDDialog::save() (./kdemultimedia/kscd/CDDialog.cpp:588)
CDDialog::save()
{
if(!checkit())
return;
QString path;
InexactDialog *dialog;
dialog = new InexactDialog(0,"Dialog",true);
// Let's get rid of some ugly double slashes such as in
// /usr/local/kde/share/apps/kscd/cddb//rock
for(int i = 0; i < (int)pathlist.count();i++)
{
QString temp = pathlist.at(i);
temp = temp.replace( QRegExp("//"), "/" );
pathlist.insert(i,temp.ascii());
pathlist.remove(i+1);
}
dialog->insertList(pathlist);
dialog->setErrorString(i18n("Please select a Category or press Cancel"));
dialog->setTitle(i18n("Under which category would you like to store this CDDB entry?"));
if(dialog->exec() != QDialog::Accepted)
{
delete dialog;
return;
}
dialog->getSelection(path);
QString mag;
mag.sprintf("%s/%08lx",path.data(),cdinfo.magicID);
save_cddb_entry(mag,false);
load();
delete dialog;
} // save
void
kscd'CDDialog::save_cddb_entry() (./kdemultimedia/kscd/CDDialog.cpp:630)
CDDialog::save_cddb_entry(QString& path,bool upload)
{
QString magic;
magic.sprintf("%08lx",cdinfo.magicID);
bool have_magic_already = false;
debug("::save_cddb_entry(): path: %s upload = %d\n", path.data(), upload);
// Steve and Ti contacted me and said they have changed the cddb upload specs
// Now, an uploaded entry must only contain one DISCID namely the one corresponding
// to the CD the user actually owns.
if( !upload )
{
for(int i = 0 ; i < (int)discidlist.count();i ++)
{
if(magic == (QString)discidlist.at(i))
{
have_magic_already = true;
break;
}
}
if(!have_magic_already)
discidlist.insert(0,magic.data());
} else { // uploading
discidlist.clear();
discidlist.insert(0,magic.data());
}
QFile file(path.data());
if( !file.open( IO_WriteOnly ))
{
QString str = i18n("Unable to write to file:\n%1\nPlease check "
"your permissions and make your category directories exist.")
.arg(path);
KMessageBox::error(this, str);
return;
}
QString tmp;
QTextStream t(&file);
if(upload && !smtpConfigData->enabled)
{
QString subject;
subject.sprintf("cddb %s %08lx", submitcat.data(), cdinfo.magicID);
t << "To: " + submitaddress + "\n";
tmp = QString("Subject: %1\n").arg(subject);
t << tmp;
}
t << "# xmcd CD database file\n";
QString datestr;
datestr = QDateTime::currentDateTime().toString();
tmp = QString("# Generated: %1 by KSCD\n").arg(datestr);
t << tmp;
// Waste some disk space
if(!upload) {
t << "# Copyright (C) 1997-1999 Bernd Johannes Wuebben.\n";
t << "# Copyright (C) 2000 Dirk Foersterling.\n";
}
t << "# \n";
t << "# Track frame offsets:\n";
for(int i = 0 ; i < cdinfo.ntracks;i ++)
{
tmp = QString("# %1\n").arg(cdinfo.cddbtoc[i].absframe);
t << tmp;
}
t << "#\n";
tmp = QString("# Disc length: %1 seconds\n").arg(cdinfo.length);
t << tmp;
t << "#\n";
if(upload)
tmp = QString("# Revision: %1\n").arg(++revision);
else
tmp = QString("# Revision: %1\n").arg(revision);
t << tmp;
t << "# Submitted via: Kscd "KSCDVERSION"\n";
t << "#\n";
tmp = "DISCID=";
int counter = 0;
for(int i = 0 ; i < (int)discidlist.count();i ++)
{
tmp += discidlist.at(i);
if( i < (int) discidlist.count() - 1)
{
if( counter++ == 3 )
{
tmp += "\nDISCID=";
counter = 0;
} else {
tmp += ",";
}
}
}
tmp += "\n";
t << tmp;
QStrList returnlist;
QString tmp2;
tmp2 = track_list.at(0);
cddb_encode(tmp2,returnlist);
if(returnlist.count() == 0)
{
// sanity provision
tmp = QString("DTITLE=%1\n").arg("");
t << tmp;
} else {
for(int i = 0; i < (int) returnlist.count();i++)
{
tmp = QString("DTITLE=%1\n").arg(returnlist.at(i));
t << tmp;
}
}
for(int i = 1 ; i < (int)track_list.count();i ++)
{
tmp2 = track_list.at(i);
cddb_encode(tmp2,returnlist);
if(returnlist.count() == 0)
{
// sanity provision
tmp = QString("TTITLE%1=%2\n").arg(i-1).arg("");
t << tmp;
} else {
for(int j = 0; j < (int) returnlist.count();j++)
{
tmp = QString("TTITLE%1=%2\n").arg(i-1).arg(returnlist.at(j));
t << tmp;
}
}
}
tmp2 = ext_list.at(0);
cddb_encode(tmp2,returnlist);
if(returnlist.count() == 0)
{
// sanity provision
tmp = tmp.sprintf("EXTD=%s\n","");
t << tmp;
} else {
for(int i = 0; i < (int) returnlist.count();i++)
{
tmp = QString("EXTD=%1\n").arg(returnlist.at(i));
t << tmp;
}
}
for(int i = 1 ; i < (int)ext_list.count();i ++)
{
tmp2 = ext_list.at(i);
cddb_encode(tmp2,returnlist);
if(returnlist.count() == 0)
{
// sanity provision
tmp = tmp.sprintf("EXTT%d=%s\n",i-1,"");
t << tmp;
} else {
for(int j = 0; j < (int) returnlist.count();j++)
{
tmp = tmp.sprintf("EXTT%d=%s\n",i-1,returnlist.at(j));
t << tmp;
}
}
}
if(!upload)
{
cddb_encode(playorder,returnlist);
for(int i = 0; i < (int) returnlist.count();i++)
{
tmp = tmp.sprintf("PLAYORDER=%s\n",returnlist.at(i));
t << tmp;
}
} else {
tmp = tmp.sprintf("PLAYORDER=\n");
t << tmp;
}
t << "\n";
file.close();
chmod(file.name().ascii(), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );
return;
} // save_cddb_entry
bool
kscd'CDDialog::checkit() (./kdemultimedia/kscd/CDDialog.cpp:840)
CDDialog::checkit()
{
QString title = titleedit->text();
title = title.stripWhiteSpace();
if(title.isEmpty())
{
KMessageBox::sorry(this,
i18n("The Disc Artist / Title field is not filled in.\n"\
"Please correct the entry and try again."),
i18n("Invalid Database Entry"));
return false;
}
int pos;
pos = title.find("/",0,true);
if(pos == -1)
{
KMessageBox::sorry(this,
i18n("The Disc Artist / Title field is not filled in correctly.\n"\
"Please separate the artist from the title of the CD with \n"\
"a forward slash, such as in: Peter Gabriel / Greatest Hits\n"),
i18n("Invalid Database Entry"));
return false;
}
if(track_list.count() < 2)
{
KMessageBox::sorry(this,
i18n("Not all track titles can be empty.\n"\
"Please correct the entry and try again."),
i18n("Invalid Database Entry"));
return false;
}
bool have_nonempty_title = false;
for(int i = 1; i < (int)track_list.count(); i++)
{
title = track_list.at(i);
title = title.stripWhiteSpace();
if(!title.isEmpty()){
have_nonempty_title = true;
break;
}
}
if(!have_nonempty_title)
{
KMessageBox::sorry(this,
i18n("Not all track titles can be empty.\n"\
"Please correct the entry and try again."),
i18n("Invalid Database Entry"));
return false;
}
if(cdinfo.ntracks +1 != (int)track_list.count() )
{
KMessageBox::error(this,
i18n("cdinfo.ntracks != title_list->count() + 1\n"
"Please email the author."),
i18n("Internal Error"));
return false;
}
QString str;
QStrList strlist;
str = progseq_edit->text();
bool ret;
ret = cddb_playlist_decode(strlist, str);
QString teststr;
bool ok;
int num;
for(uint i = 0; i < strlist.count();i++)
{
teststr = strlist.at(i);
num = teststr.toInt(&ok);
if( num > cdinfo.ntracks || !ok)
ret = false;
}
if(!ret)
{
KMessageBox::sorry(this,
i18n("Invalid Playlist\n"));
return false;
}
cddb_playlist_encode(strlist,playorder);
return true;
} // checkit
void
kscd'CDDialog::load() (./kdemultimedia/kscd/CDDialog.cpp:940)
CDDialog::load()
{
emit cddb_query_signal(true);
} // load
// simplyfied quoted printable mime encoding that should be good enough
// for our purposed. The encoding differs from the 'real' encoding in
// that we don't need to worry about trailing \n, \t or lines exeeding the
// spec length.
void