You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
321 lines
7.1 KiB
321 lines
7.1 KiB
15 years ago
|
/**************************************************************************
|
||
|
|
||
|
slman.cc - SongList Manager, which holds a set of collections (SongLists)
|
||
|
Copyright (C) 1997,98 Antonio Larrosa Jimenez
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
15 years ago
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
15 years ago
|
|
||
|
Send comments and bug fixes to larrosa@kde.org
|
||
|
or to Antonio Larrosa, Rio Arnoya, 10 5B, 29006 Malaga, Spain
|
||
|
|
||
|
***************************************************************************/
|
||
|
#include "slman.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include "version.h"
|
||
|
#include <klocale.h>
|
||
|
|
||
|
SLManager::SLManager()
|
||
|
{
|
||
|
list=NULL;
|
||
|
ntotal=0;
|
||
|
tempsl=NULL;
|
||
|
createTemporaryCollection();
|
||
|
}
|
||
|
|
||
|
SLManager::SLManager(SLManager &src)
|
||
|
{
|
||
|
list=NULL;
|
||
|
ntotal=0;
|
||
|
tempsl=NULL;
|
||
|
SongListNode *srcSL=src.list;
|
||
|
SongList *tmpSL;
|
||
|
int i;
|
||
|
while (srcSL!=NULL)
|
||
|
{
|
||
|
i=createCollection(srcSL->name);
|
||
|
tmpSL=getCollection(i);
|
||
|
if (tmpSL!=NULL)
|
||
|
tmpSL->copy(*srcSL->SL);
|
||
|
srcSL=srcSL->next;
|
||
|
}
|
||
|
if (src.tempsl!=NULL) tempsl=new SongList(*src.tempsl);
|
||
|
else tempsl=NULL;
|
||
|
}
|
||
|
|
||
|
SLManager::~SLManager()
|
||
|
{
|
||
|
SongListNode *ptr;
|
||
|
ptr=list;
|
||
|
while (ptr!=NULL)
|
||
|
{
|
||
|
list=ptr->next;
|
||
|
if (ptr->SL!=NULL) delete ptr->SL;
|
||
|
if (ptr->name!=NULL) delete ptr->name;
|
||
|
delete ptr;
|
||
|
ptr=list;
|
||
|
}
|
||
|
if (tempsl!=NULL) delete tempsl;
|
||
|
ntotal=0;
|
||
|
}
|
||
|
|
||
|
int SLManager::createCollection(const char *name)
|
||
|
{
|
||
|
SongListNode *ptr;
|
||
|
if (nameUsed(name))
|
||
|
{
|
||
|
printf("Name '%s' is already used\n",name);
|
||
|
return -1;
|
||
|
}
|
||
|
if (list==NULL)
|
||
|
{
|
||
|
list=new SongListNode;
|
||
|
list->id=1;
|
||
|
ntotal=1;
|
||
|
ptr=list;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ptr=list;
|
||
|
while (ptr->next!=NULL) ptr=ptr->next;
|
||
|
ptr->next=new SongListNode;
|
||
|
ptr=ptr->next;
|
||
|
|
||
|
ptr->id= ++ntotal;
|
||
|
}
|
||
|
ptr->SL=new SongList;
|
||
|
ptr->next=NULL;
|
||
|
if (name!=NULL)
|
||
|
{
|
||
|
ptr->name=new char[strlen(name)+1];
|
||
|
strcpy(ptr->name,name);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ptr->name=getNotUsedName();
|
||
|
}
|
||
|
return ptr->id;
|
||
|
}
|
||
|
|
||
|
char *SLManager::getNotUsedName(void)
|
||
|
{
|
||
|
char *trythis;
|
||
|
trythis=new char[100];
|
||
|
strcpy(trythis,"No Name");
|
||
|
int tries=1;
|
||
|
int success=0;
|
||
|
while (!success)
|
||
|
{
|
||
|
if (nameUsed(trythis)) sprintf(trythis,"No Name - %d",++tries);
|
||
|
else
|
||
|
success=1;
|
||
|
}
|
||
|
return trythis;
|
||
|
}
|
||
|
|
||
|
int SLManager::nameUsed(const char *name)
|
||
|
{
|
||
|
/*
|
||
|
SongListNode *ptr=list;
|
||
|
int used=0;
|
||
|
while ((!used)&&(ptr!=NULL))
|
||
|
{
|
||
|
if (strcmp(ptr->name,name)==0) used=1;
|
||
|
ptr=ptr->next;
|
||
|
};
|
||
|
return used;
|
||
|
*/
|
||
|
if (getCollection(name)==NULL) return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void SLManager::deleteCollection(int id)
|
||
|
{
|
||
|
if (list==NULL) return;
|
||
|
SongListNode *ptr=list;
|
||
|
SongListNode *ptr2;
|
||
|
if (id==1) list=list->next;
|
||
|
else
|
||
|
{
|
||
|
ptr2=list;
|
||
|
while ((ptr!=NULL)&&(ptr->id!=id))
|
||
|
{
|
||
|
ptr2=ptr;
|
||
|
ptr=ptr->next;
|
||
|
}
|
||
|
if (ptr==NULL)
|
||
|
{
|
||
|
printf("Trying to delete a not used id\n");
|
||
|
return;
|
||
|
}
|
||
|
ptr2->next=ptr->next;
|
||
|
}
|
||
|
ptr2=ptr->next;
|
||
|
delete ptr->SL;
|
||
|
delete ptr->name;
|
||
|
delete ptr;
|
||
|
regenerateid(ptr2,id);
|
||
|
|
||
|
}
|
||
|
|
||
|
void SLManager::regenerateid(SongListNode *sl,int id)
|
||
|
{
|
||
|
SongListNode *tmp=sl;
|
||
|
int i=id;
|
||
|
while (tmp!=NULL)
|
||
|
{
|
||
|
tmp->id=i++;
|
||
|
tmp=tmp->next;
|
||
|
}
|
||
|
ntotal=i-1;
|
||
|
}
|
||
|
|
||
|
void SLManager::changeCollectionName(int id,const char *newname)
|
||
|
{
|
||
|
if (id<1) return;
|
||
|
if (nameUsed(newname))
|
||
|
{
|
||
|
printf("Cannot change name, '%s' is already used\n",newname);
|
||
|
return;
|
||
|
}
|
||
|
SongListNode *ptr=list;
|
||
|
while ((ptr!=NULL)&&(ptr->id!=id)) ptr=ptr->next;
|
||
|
if (ptr==NULL) return;
|
||
|
|
||
|
delete ptr->name;
|
||
|
ptr->name=new char[strlen(newname)+1];
|
||
|
strcpy(ptr->name,newname);
|
||
|
}
|
||
|
|
||
|
SongList *SLManager::getCollection(int id)
|
||
|
{
|
||
|
if (id==0) return tempsl;
|
||
|
|
||
|
SongListNode *ptr=list;
|
||
|
while ((ptr!=NULL)&&(ptr->id!=id)) ptr=ptr->next;
|
||
|
|
||
|
if (ptr==NULL) return NULL;
|
||
|
return ptr->SL;
|
||
|
}
|
||
|
|
||
|
SongList *SLManager::getCollection(const char *name)
|
||
|
{
|
||
|
SongListNode *ptr=list;
|
||
|
while ((ptr!=NULL)&&(strcmp(ptr->name,name)!=0)) ptr=ptr->next;
|
||
|
|
||
|
if (ptr==NULL) return NULL;
|
||
|
return ptr->SL;
|
||
|
}
|
||
|
|
||
|
const char *SLManager::getCollectionName(int id)
|
||
|
{
|
||
|
if (id==0) return I18N_NOOP("Temporary Collection");
|
||
|
SongListNode *ptr=list;
|
||
|
while ((ptr!=NULL)&&(ptr->id!=id)) ptr=ptr->next;
|
||
|
|
||
|
if (ptr==NULL) return NULL;
|
||
|
return ptr->name;
|
||
|
}
|
||
|
|
||
|
void SLManager::loadConfig(const char *filename)
|
||
|
{
|
||
|
#ifdef GENERAL_DEBUG_MESSAGES
|
||
|
printf("Loading collections\n");
|
||
|
#endif
|
||
|
FILE *fh=fopen(filename,"rt");
|
||
|
if (fh==NULL)
|
||
|
{
|
||
|
printf("Collections cannot be loaded\n(File %s doesn't exist or can't be opened)\n",filename);
|
||
|
return;
|
||
|
}
|
||
|
char s[300];
|
||
|
SongList *sl=NULL;
|
||
|
int activeid=0;
|
||
|
while (!feof(fh))
|
||
|
{
|
||
|
s[0] = 0;
|
||
|
fgets(s,299,fh);
|
||
|
if ((strlen(s)>0)&&(s[strlen(s)-1]==10)) s[strlen(s)-1]=0;
|
||
|
switch (s[0])
|
||
|
{
|
||
|
case (0) : break;
|
||
|
case (10) : break;
|
||
|
case ('=') :
|
||
|
{
|
||
|
if (sl!=NULL) sl->setActiveSong(activeid);
|
||
|
int id=createCollection(&s[1]);
|
||
|
sl=getCollection(id);
|
||
|
fgets(s,299,fh);
|
||
|
activeid=atoi(s);
|
||
|
}
|
||
|
break;
|
||
|
default :
|
||
|
{
|
||
|
if (sl!=NULL) sl->AddSong((const char *)s);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (sl!=NULL) sl->setActiveSong(activeid);
|
||
|
|
||
|
fclose(fh);
|
||
|
}
|
||
|
|
||
|
void SLManager::saveConfig(const char *filename)
|
||
|
{
|
||
|
SongListNode *ptr=list;
|
||
|
FILE *fh=fopen(filename,"wt");
|
||
|
if (fh==NULL)
|
||
|
{
|
||
|
printf("Collections couldn't be saved\n");
|
||
|
return;
|
||
|
}
|
||
|
char s[FILENAME_MAX];
|
||
|
SongList *sl;
|
||
|
while (ptr!=NULL)
|
||
|
{
|
||
|
sprintf(s,"=%s\n",ptr->name);
|
||
|
fputs(s,fh);
|
||
|
|
||
|
sl=ptr->SL;
|
||
|
sprintf(s,"%d\n",sl->getActiveSongID());
|
||
|
fputs(s,fh);
|
||
|
|
||
|
sl->iteratorStart();
|
||
|
while (!sl->iteratorAtEnd())
|
||
|
{
|
||
|
sprintf(s,"%s\n",sl->getIteratorName());
|
||
|
fputs(s,fh);
|
||
|
sl->iteratorNext();
|
||
|
}
|
||
|
// ptr->SL->saveList(fh);
|
||
|
fputs("\n",fh);
|
||
|
|
||
|
ptr=ptr->next;
|
||
|
}
|
||
|
fclose(fh);
|
||
|
|
||
|
}
|
||
|
|
||
|
SongList *SLManager::createTemporaryCollection(void)
|
||
|
{
|
||
|
if (tempsl==NULL)
|
||
|
tempsl=new SongList();
|
||
|
else
|
||
|
tempsl->clean();
|
||
|
|
||
|
return tempsl;
|
||
|
}
|