summaryrefslogtreecommitdiffstats
path: root/kmid/slman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmid/slman.cpp')
-rw-r--r--kmid/slman.cpp320
1 files changed, 320 insertions, 0 deletions
diff --git a/kmid/slman.cpp b/kmid/slman.cpp
new file mode 100644
index 00000000..62acdd2b
--- /dev/null
+++ b/kmid/slman.cpp
@@ -0,0 +1,320 @@
+/**************************************************************************
+
+ 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
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ 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;
+}