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