1 /*
2  *  tracker/FileExtProvider.cpp
3  *
4  *  Copyright 2009 Peter Barth
5  *
6  *  This file is part of Milkytracker.
7  *
8  *  Milkytracker is free software: you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation, either version 3 of the License, or
11  *  (at your option) any later version.
12  *
13  *  Milkytracker is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with Milkytracker.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 /*
24  *  FileExtProvider.cpp
25  *  milkytracker_universal
26  *
27  *  Created by Peter Barth on 12.07.08.
28  *
29  */
30 
31 #include "FileExtProvider.h"
32 #include "Decompressor.h"
33 
34 const char* FileExtProvider::moduleExtensions[] =
35 {
36 	"669","Composer669",
37 	"amf","Asylum Music Format",
38 	"ams","Velvet Studio/Extreme Tracker",
39 	"cba","Chuck Biscuits & Black Artist",
40 	"dbm","Digibooster Pro",
41 	"digi","Digibooster",
42 	"dsm","Digisound Interface Kit/Dynamic Studio",
43 	"dtm","Digital Tracker/Digitrekker",
44 	"far","Farandole Composer",
45 	"gdm","General Digimusic",
46 	"gmc","Game Music Creator",
47 	"imf","Imago Orpheus",
48 	"it","Impulse Tracker",
49 	"mdl","Digitrakker",
50 	"mod","Protracker",
51 	"mtm","Multitracker",
52 	"mxm","Cubic Tiny XM",
53 	"okt","Oktalyzer",
54 	"plm","DisorderTracker",
55 	"psm","Epic Megagames MASI",
56 	"ptm","Polytracker",
57 	"s3m","Screamtracker 3",
58 	"stm","Screamtracker 2",
59 	"ult","Ultratracker",
60 	"uni","MikMod",
61 	"xm","Fasttracker 2",
62 	NULL, NULL
63 };
64 
65 const char* FileExtProvider::instrumentExtensions[] =
66 {
67 	"xi","FT2 Instruments",
68 	"pat","GUS Patches",
69 	NULL, NULL
70 };
71 
72 const char* FileExtProvider::sampleExtensions[] =
73 {
74 	"wav","WAV uncompressed",
75 	"iff","IFF (un)compressed",
76 	"8svx","IFF (un)compressed",
77 	"aif","Apple AIFF uncompressed",
78 	"aiff","Apple AIFF uncompressed",
79 	NULL, NULL
80 };
81 
82 const char* FileExtProvider::patternExtensions[] =
83 {
84 	"xp","FT2 Pattern",
85 	NULL, NULL
86 };
87 
88 const char* FileExtProvider::trackExtensions[] =
89 {
90 	"xt","FT2 Track",
91 	NULL, NULL
92 };
93 
94 const char* FileExtProvider::colorExtensions[] =
95 {
96 	"mct","MilkyTracker colors",
97 	NULL, NULL
98 };
99 
fillList(const char * const * baseList,ExtensionTypes type)100 const char* const* FileExtProvider::fillList(const char* const* baseList, ExtensionTypes type)
101 {
102 	tempExtensions.clear();
103 
104 	pp_int32 i = 0;
105 	while (true)
106 	{
107 		if (baseList[i] == NULL)
108 			break;
109 
110 		tempExtensions.add(new PPString(baseList[i]));
111 
112 		i++;
113 	}
114 
115 	// misuse a decompressor to retrieve the file types it can decompress
116 	// they're not ordered though
117 	Decompressor decompressor("");
118 
119 	if (decompressor.doesServeHint((DecompressorBase::Hints)type))
120 	{
121 		const PPSimpleVector<Descriptor>& src = decompressor.getDescriptors((DecompressorBase::Hints)type);
122 
123 		for (pp_int32 j = 0; j < src.size(); j++)
124 		{
125 			tempExtensions.add(new PPString(src.get(j)->extension));
126 			tempExtensions.add(new PPString(src.get(j)->description));
127 			i+=2;
128 		}
129 	}
130 
131 	delete[] tempList;
132 	tempList = new char*[i+2];
133 
134 	pp_int32 j = 0;
135 	for (j = 0; j < i; j++)
136 	{
137 		tempList[j] = (char*)((const char*)(*tempExtensions.get(j)));
138 	}
139 	tempList[j++] = NULL;
140 	tempList[j++] = NULL;
141 
142 	return (const char**)tempList;
143 }
144 
getModuleExtensions()145 const char* const* FileExtProvider::getModuleExtensions()
146 {
147 	return fillList(moduleExtensions, ExtensionTypeModules);
148 }
149 
getModuleExtension(ModuleExtensions extension)150 const char* FileExtProvider::getModuleExtension(ModuleExtensions extension) { return moduleExtensions[extension*2]; }
getModuleDescription(ModuleExtensions extension)151 const char* FileExtProvider::getModuleDescription(ModuleExtensions extension) { return moduleExtensions[extension*2+1]; }
152 
getInstrumentExtensions()153 const char* const* FileExtProvider::getInstrumentExtensions()
154 {
155 	return fillList(instrumentExtensions, ExtensionTypeInstruments);
156 }
157 
getInstrumentExtension(InstrumentExtensions extension)158 const char* FileExtProvider::getInstrumentExtension(InstrumentExtensions extension) { return instrumentExtensions[extension*2]; }
getInstrumentDescription(InstrumentExtensions extension)159 const char* FileExtProvider::getInstrumentDescription(InstrumentExtensions extension) { return instrumentExtensions[extension*2+1]; }
160 
getSampleExtensions()161 const char* const* FileExtProvider::getSampleExtensions()
162 {
163 	return fillList(sampleExtensions, ExtensionTypeSamples);
164 }
165 
getSampleExtension(SampleExtensions extension)166 const char* FileExtProvider::getSampleExtension(SampleExtensions extension) { return sampleExtensions[extension*2]; }
getSampleDescription(SampleExtensions extension)167 const char* FileExtProvider::getSampleDescription(SampleExtensions extension) { return sampleExtensions[extension*2+1]; }
168 
getPatternExtensions()169 const char* const* FileExtProvider::getPatternExtensions()
170 {
171 	return fillList(patternExtensions, ExtensionTypePatterns);
172 }
173 
getPatternExtension(PatternExtensions extension)174 const char* FileExtProvider::getPatternExtension(PatternExtensions extension) { return patternExtensions[extension*2]; }
getPatternDescription(PatternExtensions extension)175 const char* FileExtProvider::getPatternDescription(PatternExtensions extension) { return patternExtensions[extension*2+1]; }
176 
getTrackExtensions()177 const char* const* FileExtProvider::getTrackExtensions()
178 {
179 	return fillList(trackExtensions, ExtensionTypeTracks);
180 }
181 
getTrackExtension(TrackExtensions extension)182 const char* FileExtProvider::getTrackExtension(TrackExtensions extension) { return trackExtensions[extension*2]; }
getTrackDescription(TrackExtensions extension)183 const char* FileExtProvider::getTrackDescription(TrackExtensions extension) { return trackExtensions[extension*2+1]; }
184 
getColorExtensions()185 const char* const* FileExtProvider::getColorExtensions()
186 {
187 	return colorExtensions;
188 }
189 
getColorExtension(ColorExtensions extension)190 const char* FileExtProvider::getColorExtension(ColorExtensions extension) { return colorExtensions[extension*2]; }
getColorDescription(ColorExtensions extension)191 const char* FileExtProvider::getColorDescription(ColorExtensions extension) { return colorExtensions[extension*2+1]; }
192 
193