2 // This file is part of the aMule Project.
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 // The backtrace functions contain modified code from libYaMa, (c) Venkatesha Murthy G.
27 // You can check libYaMa at http://personal.pavanashree.org/libyama/
29 #include <tags/FileTags.h>
31 #include <wx/filename.h> // Needed for wxFileName
32 #include <wx/log.h> // Needed for wxLogNull
35 #include "config.h" // Needed for a number of defines
38 #include <wx/stdpaths.h> // Do_not_auto_remove
39 #include <common/StringFunctions.h>
40 #include <common/ClientVersion.h>
41 #include <common/MD5Sum.h>
42 #include <common/Path.h>
44 #include "BitVector.h" // Needed for BitVector
46 #include "OtherFunctions.h" // Interface declarations
57 wxString
GetMuleVersion()
59 wxString
ver(wxT(VERSION
));
61 ver
+= wxT(" compiled with ");
64 // Figure out the wx build-type
65 #if defined(__WXGTK20__)
67 #elif defined(__WXGTK__)
69 // 2.9 has different builds for OSX: Carbon and Cocoa
70 #elif defined(__WXOSX_CARBON__)
71 ver
+= wxT("wxOSX Carbon");
72 #elif defined(__WXOSX_COCOA__)
73 ver
+= wxT("wxOSX Cocoa");
74 // different Cocoa port, "not been updated very actively since beginning 2008"
75 #elif defined(__WXCOCOA__)
76 ver
+= wxT("wxCocoa");
78 #elif defined(__WXMAC__)
80 #elif defined(__WXBASE__)
82 #elif defined(__WINDOWS__) && defined(__VISUALC__)
83 ver
+= wxT("wxMSW VC");
84 #elif defined(__WINDOWS__)
88 ver
+= CFormat(wxT(" v%d.%d.%d")) % wxMAJOR_VERSION
% wxMINOR_VERSION
% wxRELEASE_NUMBER
;
90 if (!MuleBoostVersion
.IsEmpty()) {
91 ver
+= wxT(" and Boost ") + MuleBoostVersion
;
95 ver
+= wxT(" (Debugging)");
99 ver
+= CFormat(wxT(" (Snapshot: %s)")) % wxT(SVNDATE
);
106 // Formats a filesize in bytes to make it suitable for displaying
107 wxString
CastItoXBytes( uint64 count
)
111 return CFormat(wxT("%u ")) % count
+ wxPLURAL("byte", "bytes", count
) ;
112 else if (count
< 1048576)
113 return CFormat(wxT("%u ")) % (count
>> 10) + _("kB") ;
114 else if (count
< 1073741824)
115 return CFormat(wxT("%.2f ")) % ((float)(uint32
)count
/1048576) + _("MB") ;
116 else if (count
< 1099511627776LL)
117 return CFormat(wxT("%.3f ")) % ((float)((uint32
)(count
/1024))/1048576) + _("GB") ;
119 return CFormat(wxT("%.3f ")) % ((float)count
/1099511627776LL) + _("TB") ;
123 wxString
CastItoIShort(uint64 count
)
127 return CFormat(wxT("%u")) % count
;
128 else if (count
< 1000000)
129 return CFormat(wxT("%.0f")) % ((float)(uint32
)count
/1000) + _("k") ;
130 else if (count
< 1000000000)
131 return CFormat(wxT("%.2f")) % ((float)(uint32
)count
/1000000) + _("M") ;
132 else if (count
< 1000000000000LL)
133 return CFormat(wxT("%.2f")) % ((float)((uint32
)(count
/1000))/1000000) + _("G") ;
135 return CFormat(wxT("%.2f")) % ((float)count
/1000000000000LL) + _("T");
139 wxString
CastItoSpeed(uint32 bytes
)
142 return CFormat(wxT("%u ")) % bytes
+ wxPLURAL("byte/sec", "bytes/sec", bytes
);
143 else if (bytes
< 1048576)
144 return CFormat(wxT("%.2f ")) % (bytes
/ 1024.0) + _("kB/s");
146 return CFormat(wxT("%.2f ")) % (bytes
/ 1048576.0) + _("MB/s");
150 // Make a time value in seconds suitable for displaying
151 wxString
CastSecondsToHM(uint32 count
, uint16 msecs
)
155 return CFormat(wxT("%02u %s")) % count
% _("secs");
157 return CFormat(wxT("%.3f %s"))
158 % (count
+ ((float)msecs
/1000)) % _("secs");
160 } else if (count
< 3600) {
161 return CFormat(wxT("%u:%02u %s"))
162 % (count
/60) % (count
% 60) % _("mins");
163 } else if (count
< 86400) {
164 return CFormat(wxT("%u:%02u %s"))
165 % (count
/3600) % ((count
% 3600)/60) % _("hours");
167 return CFormat(wxT("%u %s %02u:%02u %s"))
168 % (count
/86400) % _("Days")
169 % ((count
% 86400)/3600) % ((count
% 3600)/60) % _("hours");
174 // Examines a filename and determines the filetype
175 FileType
GetFiletype(const CPath
& filename
)
177 // FIXME: WTF do we have two such functions in the first place?
178 switch (GetED2KFileTypeID(filename
)) {
179 case ED2KFT_AUDIO
: return ftAudio
;
180 case ED2KFT_VIDEO
: return ftVideo
;
181 case ED2KFT_IMAGE
: return ftPicture
;
182 case ED2KFT_PROGRAM
: return ftProgram
;
183 case ED2KFT_DOCUMENT
: return ftText
;
184 case ED2KFT_ARCHIVE
: return ftArchive
;
185 case ED2KFT_CDIMAGE
: return ftCDImage
;
186 default: return ftAny
;
191 // Returns the (translated) description assosiated with a FileType
192 wxString
GetFiletypeDesc(FileType type
, bool translated
)
199 return wxT("Videos");
211 return _("Archives");
213 return wxT("Archives");
218 return _("CD-Images");
220 return wxT("CD-Images");
225 return _("Pictures");
227 return wxT("Pictures");
239 return _("Programs");
241 return wxT("Programs");
254 // Returns the Typename, examining the extention of the given filename
256 wxString
GetFiletypeByName(const CPath
& filename
, bool translated
)
258 return GetFiletypeDesc(GetFiletype(filename
), translated
);
262 // Return the text associated with a rating of a file
263 wxString
GetRateString(uint16 rate
)
266 case 0: return _("Not rated");
267 case 1: return _("Invalid / Corrupt / Fake");
268 case 2: return _("Poor");
269 case 3: return _("Fair");
270 case 4: return _("Good");
271 case 5: return _("Excellent");
272 default: return _("Not rated");
278 * Return the size in bytes of the given size-type
280 * @param type The type (as an int) where: 0 = Byte, 1 = KB, 2 = MB, 3 = GB
282 * @return The amount of Bytes the provided size-type represents
284 * Values over GB aren't handled since the amount of Bytes 1TB represents
285 * is over the uint32 capacity
287 uint32
GetTypeSize(uint8 type
)
289 enum {Bytes
, KB
, MB
, GB
};
293 case Bytes
: size
= 1; break;
294 case KB
: size
= 1024; break;
295 case MB
: size
= 1048576; break;
296 case GB
: size
= 1073741824; break;
297 default: size
= -1; break;
303 // Base16 chars for encode an decode functions
304 static wxChar base16Chars
[17] = wxT("0123456789ABCDEF");
305 static wxChar base32Chars
[33] = wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
306 #define BASE16_LOOKUP_MAX 23
307 static wxChar base16Lookup
[BASE16_LOOKUP_MAX
][2] = {
334 // Returns a BASE16 encoded byte array
337 // buffer: Pointer to byte array
338 // bufLen: Lenght of buffer array
341 // wxString object with BASE16 encoded byte array
342 wxString
EncodeBase16(const unsigned char* buffer
, unsigned int bufLen
)
346 for(unsigned int i
= 0; i
< bufLen
; ++i
) {
347 Base16Buff
+= base16Chars
[buffer
[i
] >> 4];
348 Base16Buff
+= base16Chars
[buffer
[i
] & 0xf];
355 // Decodes a BASE16 string into a byte array
358 // base16Buffer: String containing BASE16
359 // base16BufLen: Lenght BASE16 coded string's length
362 // buffer: byte array containing decoded string
363 unsigned int DecodeBase16(const wxString
&base16Buffer
, unsigned int base16BufLen
, byte
*buffer
)
365 if (base16BufLen
& 1) {
368 unsigned int ret
= base16BufLen
>> 1;
369 memset( buffer
, 0, ret
);
370 for(unsigned int i
= 0; i
< base16BufLen
; ++i
) {
371 int lookup
= toupper(base16Buffer
[i
]) - wxT('0');
372 // Check to make sure that the given word falls inside a valid range
373 byte word
= (lookup
< 0 || lookup
>= BASE16_LOOKUP_MAX
) ?
374 0xFF : base16Lookup
[lookup
][1];
375 unsigned idx
= i
>> 1;
376 buffer
[idx
] = (i
& 1) ? // odd or even?
377 (buffer
[idx
] | word
) : (word
<< 4);
384 // Returns a BASE32 encoded byte array
387 // buffer: Pointer to byte array
388 // bufLen: Lenght of buffer array
391 // wxString object with BASE32 encoded byte array
392 wxString
EncodeBase32(const unsigned char* buffer
, unsigned int bufLen
)
395 unsigned int i
, index
;
398 for(i
= 0, index
= 0; i
< bufLen
;) {
399 // Is the current word going to span a byte boundary?
401 word
= (buffer
[i
] & (0xFF >> index
));
402 index
= (index
+ 5) % 8;
404 if (i
< bufLen
- 1) {
405 word
|= buffer
[i
+ 1] >> (8 - index
);
409 word
= (buffer
[i
] >> (8 - (index
+ 5))) & 0x1F;
410 index
= (index
+ 5) % 8;
415 Base32Buff
+= (char) base32Chars
[word
];
422 // Decodes a BASE32 string into a byte array
425 // base32Buffer: String containing BASE32
426 // base32BufLen: Lenght BASE32 coded string's length
429 // buffer: byte array containing decoded string
432 unsigned int DecodeBase32(const wxString
&base32Buffer
, unsigned int base32BufLen
, unsigned char *buffer
)
434 size_t nInputLen
= base32Buffer
.Length();
435 uint32 nDecodeLen
= (nInputLen
* 5) / 8;
436 if ((nInputLen
* 5) % 8 > 0) {
439 if (base32BufLen
== 0) {
442 if (nDecodeLen
> base32BufLen
) {
448 for (size_t i
= 0; i
< nInputLen
; ++i
)
450 if (base32Buffer
[i
] >= wxT('A') && base32Buffer
[i
] <= wxT('Z')) {
451 nBits
|= ( base32Buffer
[i
] - wxT('A') );
453 else if (base32Buffer
[i
] >= wxT('a') && base32Buffer
[i
] <= wxT('z')) {
454 nBits
|= ( base32Buffer
[i
] - wxT('a') );
456 else if (base32Buffer
[i
] >= wxT('2') && base32Buffer
[i
] <= wxT('7')) {
457 nBits
|= ( base32Buffer
[i
] - wxT('2') + 26 );
464 *buffer
++ = (byte
)( nBits
>> (nCount
- 8) );
477 * Base64 encoding/decoding command line filter
479 * Copyright (c) 2002-2011 Matthias Gaertner
480 * Adapted to use wxWidgets by
481 * Copyright (c) 2005-2011 Marcelo Roberto Jimenez ( phoenix@amule.org )
484 static const wxString
to_b64(
485 /* 0000000000111111111122222222223333333333444444444455555555556666 */
486 /* 0123456789012345678901234567890123456789012345678901234567890123 */
487 wxT("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"));
490 /* Option variables */
491 static bool g_fUseCRLF
= false;
492 static unsigned int g_nCharsPerLine
= 72;
493 static wxString strHeaderLine
;
496 wxString
EncodeBase64(const char *pbBufferIn
, unsigned int bufLen
)
498 wxString pbBufferOut
;
501 if( !strHeaderLine
.IsEmpty() ) {
502 strHeader
= wxT("-----BEGIN ") + strHeaderLine
+ wxT("-----");
504 strHeader
+= wxT("\r");
506 strHeader
+= wxT("\n");
509 unsigned long nDiv
= ((unsigned long)bufLen
) / 3;
510 unsigned long nRem
= ((unsigned long)bufLen
) % 3;
511 unsigned int NewLineSize
= g_fUseCRLF
? 2 : 1;
513 // Allocate enough space in the output buffer to speed up things
515 strHeader
.Len() * 2 + // header/footer
516 (bufLen
* 4) / 3 + 1 + // Number of codes
517 nDiv
* NewLineSize
+ // Number of new lines
518 (nRem
? 1 : 0) * NewLineSize
); // Last line
519 pbBufferOut
= strHeader
;
521 unsigned long nChars
= 0;
522 const unsigned char *pIn
= (unsigned char*)pbBufferIn
;
524 pbBufferOut
+= to_b64
[ (pIn
[0] >> 2) & 0x3f];
525 pbBufferOut
+= to_b64
[((pIn
[0] << 4) & 0x30) | ((pIn
[1] >> 4) & 0xf)];
526 pbBufferOut
+= to_b64
[((pIn
[1] << 2) & 0x3c) | ((pIn
[2] >> 6) & 0x3)];
527 pbBufferOut
+= to_b64
[ pIn
[2] & 0x3f];
531 if( nChars
>= g_nCharsPerLine
&& g_nCharsPerLine
!= 0 ) {
534 pbBufferOut
+= wxT("\r");
536 pbBufferOut
+= wxT("\n");
541 pbBufferOut
+= to_b64
[ (pIn
[0] >> 2) & 0x3f];
542 pbBufferOut
+= to_b64
[((pIn
[0] << 4) & 0x30) | ((pIn
[1] >> 4) & 0xf)];
543 pbBufferOut
+= to_b64
[ (pIn
[1] << 2) & 0x3c];
544 pbBufferOut
+= wxT("=");
546 if( nChars
>= g_nCharsPerLine
&& g_nCharsPerLine
!= 0 ) {
549 pbBufferOut
+= wxT("\r");
551 pbBufferOut
+= wxT("\n");
555 pbBufferOut
+= to_b64
[ (pIn
[0] >> 2) & 0x3f];
556 pbBufferOut
+= to_b64
[ (pIn
[0] << 4) & 0x30];
557 pbBufferOut
+= wxT("=");
558 pbBufferOut
+= wxT("=");
560 if( nChars
>= g_nCharsPerLine
&& g_nCharsPerLine
!= 0 ) {
563 pbBufferOut
+= wxT("\r");
565 pbBufferOut
+= wxT("\n");
573 pbBufferOut
+= wxT("\r");
575 pbBufferOut
+= wxT("\n");
579 if( !strHeaderLine
.IsEmpty() ) {
580 pbBufferOut
= wxT("-----END ") + strHeaderLine
+ wxT("-----");
582 pbBufferOut
+= wxT("\r");
584 pbBufferOut
+= wxT("\n");
591 unsigned int DecodeBase64(const wxString
&base64Buffer
, unsigned int base64BufLen
, unsigned char *buffer
)
593 int z
= 0; // 0 Normal, 1 skip MIME separator (---) to end of line
594 unsigned int nData
= 0;
597 if (base64BufLen
== 0) {
602 for(unsigned int j
= 0; j
< base64BufLen
; ++j
) {
603 wxChar c
= base64Buffer
[j
];
604 wxChar bits
= wxT('z');
610 else if(c
>= wxT('A') && c
<= wxT('Z')) {
613 else if(c
>= wxT('a') && c
<= wxT('z')) {
614 bits
= c
- wxT('a') + (wxChar
)26;
616 else if(c
>= wxT('0') && c
<= wxT('9')) {
617 bits
= c
- wxT('0') + (wxChar
)52;
619 else if(c
== wxT('+')) {
622 else if(c
== wxT('/')) {
625 else if(c
== wxT('-')) {
628 else if(c
== wxT('=')) {
634 // Skips anything that was not recognized
635 // as a base64 valid char ('y' or 'z')
636 if (bits
< (wxChar
)64) {
639 buffer
[i
+0] = (bits
<< 2) & 0xfc;
642 buffer
[i
+0] |= (bits
>> 4) & 0x03;
643 buffer
[i
+1] = (bits
<< 4) & 0xf0;
646 buffer
[i
+1] |= (bits
>> 2) & 0x0f;
647 buffer
[i
+2] = (bits
<< 6) & 0xc0;
650 buffer
[i
+2] |= bits
& 0x3f;
660 // Syntax error or buffer was empty
672 // Returns the text assosiated with a category type
673 wxString
GetCatTitle(AllCategoryFilter cat
)
676 case acfAll
: return _("all");
677 case acfAllOthers
: return _("all others");
678 case acfIncomplete
: return _("Incomplete");
679 case acfCompleted
: return _("Completed");
680 case acfWaiting
: return _("Waiting");
681 case acfDownloading
: return _("Downloading");
682 case acfErroneous
: return _("Erroneous");
683 case acfPaused
: return _("Paused");
684 case acfStopped
: return _("Stopped");
685 case acfVideo
: return _("Video");
686 case acfAudio
: return _("Audio");
687 case acfArchive
: return _("Archive");
688 case acfCDImages
: return _("CD-Images");
689 case acfPictures
: return _("Pictures");
690 case acfText
: return _("Text");
691 case acfActive
: return _("Active");
692 default: return wxT("?");
697 typedef std::map
<wxString
, EED2KFileTypeClass
> SED2KFileTypeMap
;
698 typedef SED2KFileTypeMap::value_type SED2KFileTypeMapElement
;
699 static SED2KFileTypeMap ED2KFileTypesMap
;
702 class CED2KFileTypes
{
706 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".669"), ED2KFT_AUDIO
)); // 8 channel tracker module
707 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".aac"), ED2KFT_AUDIO
)); // Advanced Audio Coding File
708 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ac3"), ED2KFT_AUDIO
)); // Audio Codec 3 File
709 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".aif"), ED2KFT_AUDIO
)); // Audio Interchange File Format
710 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".aifc"), ED2KFT_AUDIO
)); // Audio Interchange File Format
711 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".aiff"), ED2KFT_AUDIO
)); // Audio Interchange File Format
712 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".amf"), ED2KFT_AUDIO
)); // DSMI Advanced Module Format
713 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".amr"), ED2KFT_AUDIO
)); // Adaptive Multi-Rate Codec File
714 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ams"), ED2KFT_AUDIO
)); // Extreme Tracker Module
715 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ape"), ED2KFT_AUDIO
)); // Monkey's Audio Lossless Audio File
716 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".au"), ED2KFT_AUDIO
)); // Audio File (Sun, Unix)
717 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".aud"), ED2KFT_AUDIO
)); // General Audio File
718 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".audio"), ED2KFT_AUDIO
)); // General Audio File
719 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cda"), ED2KFT_AUDIO
)); // CD Audio Track
720 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dbm"), ED2KFT_AUDIO
));
721 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dmf"), ED2KFT_AUDIO
)); // Delusion Digital Music File
722 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dsm"), ED2KFT_AUDIO
)); // Digital Sound Module
723 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dts"), ED2KFT_AUDIO
)); // DTS Encoded Audio File
724 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".far"), ED2KFT_AUDIO
)); // Farandole Composer Module
725 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".flac"), ED2KFT_AUDIO
)); // Free Lossless Audio Codec File
726 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".it"), ED2KFT_AUDIO
)); // Impulse Tracker Module
727 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m1a"), ED2KFT_AUDIO
)); // MPEG-1 Audio File
728 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m2a"), ED2KFT_AUDIO
)); // MPEG-2 Audio File
729 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m4a"), ED2KFT_AUDIO
)); // MPEG-4 Audio File
730 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mdl"), ED2KFT_AUDIO
)); // DigiTrakker Module
731 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".med"), ED2KFT_AUDIO
)); // Amiga MED Sound File
732 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mid"), ED2KFT_AUDIO
)); // MIDI File
733 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".midi"), ED2KFT_AUDIO
)); // MIDI File
734 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mka"), ED2KFT_AUDIO
)); // Matroska Audio File
735 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mod"), ED2KFT_AUDIO
)); // Amiga Music Module File
736 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mol"), ED2KFT_AUDIO
));
737 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp1"), ED2KFT_AUDIO
)); // MPEG-1 Audio File
738 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp2"), ED2KFT_AUDIO
)); // MPEG-2 Audio File
739 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp3"), ED2KFT_AUDIO
)); // MPEG-3 Audio File
740 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpa"), ED2KFT_AUDIO
)); // MPEG Audio File
741 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpc"), ED2KFT_AUDIO
)); // Musepack Compressed Audio File
742 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpp"), ED2KFT_AUDIO
));
743 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mtm"), ED2KFT_AUDIO
)); // MultiTracker Module
744 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".nst"), ED2KFT_AUDIO
)); // NoiseTracker
745 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ogg"), ED2KFT_AUDIO
)); // Ogg Vorbis Compressed Audio File
746 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".okt"), ED2KFT_AUDIO
)); // Oktalyzer Module (Amiga)
747 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".psm"), ED2KFT_AUDIO
)); // Protracker Studio Module
748 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ptm"), ED2KFT_AUDIO
)); // PolyTracker Module
749 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ra"), ED2KFT_AUDIO
)); // Real Audio File
750 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rmi"), ED2KFT_AUDIO
)); // MIDI File
751 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".s3m"), ED2KFT_AUDIO
)); // Scream Tracker 3 Module
752 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".snd"), ED2KFT_AUDIO
)); // Audio File (Sun, Unix)
753 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".stm"), ED2KFT_AUDIO
)); // Scream Tracker 2 Module
754 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ult"), ED2KFT_AUDIO
)); // UltraTracker
755 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".umx"), ED2KFT_AUDIO
)); // Unreal Music Package
756 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wav"), ED2KFT_AUDIO
)); // WAVE Audio File
757 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wma"), ED2KFT_AUDIO
)); // Windows Media Audio File
758 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wow"), ED2KFT_AUDIO
)); // Grave Composer audio tracker
759 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xm"), ED2KFT_AUDIO
)); // Fasttracker 2 Extended Module
761 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".3g2"), ED2KFT_VIDEO
)); // 3GPP Multimedia File
762 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".3gp"), ED2KFT_VIDEO
)); // 3GPP Multimedia File
763 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".3gp2"), ED2KFT_VIDEO
)); // 3GPP Multimedia File
764 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".3gpp"), ED2KFT_VIDEO
)); // 3GPP Multimedia File
765 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".asf"), ED2KFT_VIDEO
)); // Advanced Systems Format (MS)
766 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".amv"), ED2KFT_VIDEO
)); // Anime Music Video File
767 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".asf"), ED2KFT_VIDEO
)); // Advanced Systems Format File
768 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".avi"), ED2KFT_VIDEO
)); // Audio Video Interleave File
769 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bik"), ED2KFT_VIDEO
)); // BINK Video File
770 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".divx"), ED2KFT_VIDEO
)); // DivX-Encoded Movie File
771 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dvr-ms"),ED2KFT_VIDEO
)); // Microsoft Digital Video Recording
772 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".flc"), ED2KFT_VIDEO
)); // FLIC Video File
773 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".fli"), ED2KFT_VIDEO
)); // FLIC Video File
774 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".flic"), ED2KFT_VIDEO
)); // FLIC Video File
775 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".flv"), ED2KFT_VIDEO
)); // Flash Video File
776 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".hdmov"), ED2KFT_VIDEO
)); // High-Definition QuickTime Movie
777 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ifo"), ED2KFT_VIDEO
)); // DVD-Video Disc Information File
778 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m1v"), ED2KFT_VIDEO
)); // MPEG-1 Video File
779 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m2t"), ED2KFT_VIDEO
)); // MPEG-2 Video Transport Stream
780 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m2ts"), ED2KFT_VIDEO
)); // MPEG-2 Video Transport Stream
781 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m2v"), ED2KFT_VIDEO
)); // MPEG-2 Video File
782 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m4b"), ED2KFT_VIDEO
)); // MPEG-4 Video File
783 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".m4v"), ED2KFT_VIDEO
)); // MPEG-4 Video File
784 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mkv"), ED2KFT_VIDEO
)); // Matroska Video File
785 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mov"), ED2KFT_VIDEO
)); // QuickTime Movie File
786 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".movie"), ED2KFT_VIDEO
)); // QuickTime Movie File
787 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp1v"), ED2KFT_VIDEO
)); // QuickTime Movie File
788 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp2v"), ED2KFT_VIDEO
)); // MPEG-1 Video File
789 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mp4"), ED2KFT_VIDEO
)); // MPEG-2 Video File
790 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpe"), ED2KFT_VIDEO
)); // MPEG-4 Video File
791 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpeg"), ED2KFT_VIDEO
)); // MPEG Video File
792 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpg"), ED2KFT_VIDEO
)); // MPEG Video File
793 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mps"), ED2KFT_VIDEO
)); // MPEG Video File
794 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpv"), ED2KFT_VIDEO
)); // MPEG Video File
795 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpv1"), ED2KFT_VIDEO
)); // MPEG-1 Video File
796 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mpv2"), ED2KFT_VIDEO
)); // MPEG-2 Video File
797 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ogm"), ED2KFT_VIDEO
)); // Ogg Media File
798 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ogv"), ED2KFT_VIDEO
)); // Ogg Theora Video File
799 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pva"), ED2KFT_VIDEO
)); // MPEG Video File
800 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".qt"), ED2KFT_VIDEO
)); // QuickTime Movie
801 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ram"), ED2KFT_VIDEO
)); // Real Audio Media
802 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ratdvd"),ED2KFT_VIDEO
)); // RatDVD Disk Image
803 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rm"), ED2KFT_VIDEO
)); // Real Media File
804 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rmm"), ED2KFT_VIDEO
)); // Real Media File
805 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rmvb"), ED2KFT_VIDEO
)); // Real Video Variable Bit Rate File
806 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rv"), ED2KFT_VIDEO
)); // Real Video File
807 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rv9"), ED2KFT_VIDEO
));
808 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".smil"), ED2KFT_VIDEO
)); // SMIL Presentation File
809 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".smk"), ED2KFT_VIDEO
)); // Smacker Compressed Movie File
810 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".swf"), ED2KFT_VIDEO
)); // Macromedia Flash Movie
811 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tp"), ED2KFT_VIDEO
)); // Video Transport Stream File
812 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ts"), ED2KFT_VIDEO
)); // Video Transport Stream File
813 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vid"), ED2KFT_VIDEO
)); // General Video File
814 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".video"), ED2KFT_VIDEO
)); // General Video File
815 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vivo"), ED2KFT_VIDEO
)); // VivoActive Video File
816 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vob"), ED2KFT_VIDEO
)); // DVD Video Object File
817 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vp6"), ED2KFT_VIDEO
)); // TrueMotion VP6 Video File
818 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".webm"), ED2KFT_VIDEO
)); // WebM Video File
819 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wm"), ED2KFT_VIDEO
)); // Windows Media Video File
820 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wmv"), ED2KFT_VIDEO
)); // Windows Media Video File
821 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xvid"), ED2KFT_VIDEO
)); // Xvid-Encoded Video File
823 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bmp"), ED2KFT_IMAGE
)); // Bitmap Image File
824 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dcx"), ED2KFT_IMAGE
)); // FAXserve Fax Document
825 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".emf"), ED2KFT_IMAGE
)); // Enhanced Windows Metafile
826 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".gif"), ED2KFT_IMAGE
)); // Graphical Interchange Format File
827 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ico"), ED2KFT_IMAGE
)); // Icon File
828 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".jfif"), ED2KFT_IMAGE
)); // JPEG File Interchange Format
829 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".jpe"), ED2KFT_IMAGE
)); // JPEG Image File
830 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".jpeg"), ED2KFT_IMAGE
)); // JPEG Image File
831 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".jpg"), ED2KFT_IMAGE
)); // JPEG Image File
832 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pct"), ED2KFT_IMAGE
)); // PICT Picture File
833 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pcx"), ED2KFT_IMAGE
)); // Paintbrush Bitmap Image File
834 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pic"), ED2KFT_IMAGE
)); // PICT Picture File
835 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pict"), ED2KFT_IMAGE
)); // PICT Picture File
836 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".png"), ED2KFT_IMAGE
)); // Portable Network Graphic
837 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".psd"), ED2KFT_IMAGE
)); // Photoshop Document
838 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".psp"), ED2KFT_IMAGE
)); // Paint Shop Pro Image File
839 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tga"), ED2KFT_IMAGE
)); // Targa Graphic
840 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tif"), ED2KFT_IMAGE
)); // Tagged Image File
841 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tiff"), ED2KFT_IMAGE
)); // Tagged Image File
842 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wbmp"), ED2KFT_IMAGE
)); // Wireless Application Protocol Bitmap Format
843 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".webp"), ED2KFT_IMAGE
)); // Weppy Photo File
844 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wmf"), ED2KFT_IMAGE
)); // Windows Metafile
845 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wmp"), ED2KFT_IMAGE
)); // Windows Media Photo File
846 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xif"), ED2KFT_IMAGE
)); // ScanSoft Pagis Extended Image Format File
847 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xpm"), ED2KFT_IMAGE
)); // X-Windows Pixmap
849 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".7z"), ED2KFT_ARCHIVE
)); // 7-Zip Compressed File
850 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ace"), ED2KFT_ARCHIVE
)); // WinAce Compressed File
851 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".alz"), ED2KFT_ARCHIVE
)); // ALZip Archive
852 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".arc"), ED2KFT_ARCHIVE
)); // Compressed File Archive
853 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".arj"), ED2KFT_ARCHIVE
)); // ARJ Compressed File Archive
854 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bz2"), ED2KFT_ARCHIVE
)); // Bzip Compressed File
855 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cab"), ED2KFT_ARCHIVE
)); // Cabinet File
856 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cbr"), ED2KFT_ARCHIVE
)); // Comic Book RAR Archive
857 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cbt"), ED2KFT_ARCHIVE
)); // Comic Book Tarball
858 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cbz"), ED2KFT_ARCHIVE
)); // Comic Book ZIP Archive
859 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".gz"), ED2KFT_ARCHIVE
)); // Gnu Zipped File
860 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".hqx"), ED2KFT_ARCHIVE
)); // BinHex 4.0 Encoded File
861 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".lha"), ED2KFT_ARCHIVE
)); // LHARC Compressed Archive
862 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".lzh"), ED2KFT_ARCHIVE
)); // LZH Compressed File
863 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".msi"), ED2KFT_ARCHIVE
)); // Microsoft Installer File
864 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pak"), ED2KFT_ARCHIVE
)); // PAK (Packed) File
865 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".par"), ED2KFT_ARCHIVE
)); // Parchive Index File
866 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".par2"), ED2KFT_ARCHIVE
)); // Parchive 2 Index File
867 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rar"), ED2KFT_ARCHIVE
)); // WinRAR Compressed Archive
868 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sea"), ED2KFT_ARCHIVE
)); // Self-Extracting Archive (Mac)
869 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sit"), ED2KFT_ARCHIVE
)); // Stuffit Archive
870 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sitx"), ED2KFT_ARCHIVE
)); // Stuffit X Archive
871 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tar"), ED2KFT_ARCHIVE
)); // Consolidated Unix File Archive
872 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tbz2"), ED2KFT_ARCHIVE
)); // Tar BZip 2 Compressed File
873 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".tgz"), ED2KFT_ARCHIVE
)); // Gzipped Tar File
874 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".uc2"), ED2KFT_ARCHIVE
)); // UltraCompressor 2 Archive
875 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xpi"), ED2KFT_ARCHIVE
)); // Mozilla Installer Package
876 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".z"), ED2KFT_ARCHIVE
)); // Unix Compressed File
877 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".zip"), ED2KFT_ARCHIVE
)); // Zipped File
878 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".zoo"), ED2KFT_ARCHIVE
)); // Zoo Archive
880 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bat"), ED2KFT_PROGRAM
)); // Batch File
881 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cmd"), ED2KFT_PROGRAM
)); // Command File
882 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".com"), ED2KFT_PROGRAM
)); // COM File
883 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".exe"), ED2KFT_PROGRAM
)); // Executable File
884 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".hta"), ED2KFT_PROGRAM
)); // HTML Application
885 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".js"), ED2KFT_PROGRAM
)); // Java Script
886 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".jse"), ED2KFT_PROGRAM
)); // Encoded Java Script
887 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".msc"), ED2KFT_PROGRAM
)); // Microsoft Common Console File
888 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vbe"), ED2KFT_PROGRAM
)); // Encoded Visual Basic Script File
889 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".vbs"), ED2KFT_PROGRAM
)); // Visual Basic Script File
890 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wsf"), ED2KFT_PROGRAM
)); // Windows Script File
891 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wsh"), ED2KFT_PROGRAM
)); // Windows Scripting Host File
893 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bin"), ED2KFT_CDIMAGE
)); // CD Image
894 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bwa"), ED2KFT_CDIMAGE
)); // BlindWrite Disk Information File
895 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bwi"), ED2KFT_CDIMAGE
)); // BlindWrite CD/DVD Disc Image
896 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bws"), ED2KFT_CDIMAGE
)); // BlindWrite Sub Code File
897 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".bwt"), ED2KFT_CDIMAGE
)); // BlindWrite 4 Disk Image
898 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ccd"), ED2KFT_CDIMAGE
)); // CloneCD Disk Image
899 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".cue"), ED2KFT_CDIMAGE
)); // Cue Sheet File
900 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dmg"), ED2KFT_CDIMAGE
)); // Mac OS X Disk Image
901 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dmz"), ED2KFT_CDIMAGE
));
902 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".img"), ED2KFT_CDIMAGE
)); // Disk Image Data File
903 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".iso"), ED2KFT_CDIMAGE
)); // Disc Image File
904 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mdf"), ED2KFT_CDIMAGE
)); // Media Disc Image File
905 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mds"), ED2KFT_CDIMAGE
)); // Media Descriptor File
906 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".nrg"), ED2KFT_CDIMAGE
)); // Nero CD/DVD Image File
907 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sub"), ED2KFT_CDIMAGE
)); // Subtitle File
908 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".toast"), ED2KFT_CDIMAGE
)); // Toast Disc Image
910 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".azw"), ED2KFT_DOCUMENT
)); // EBook File
911 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".chm"), ED2KFT_DOCUMENT
)); // Compiled HTML Help File
912 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".css"), ED2KFT_DOCUMENT
)); // Cascading Style Sheet
913 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".diz"), ED2KFT_DOCUMENT
)); // Description in Zip File
914 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".doc"), ED2KFT_DOCUMENT
)); // Document File
915 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".dot"), ED2KFT_DOCUMENT
)); // Document Template File
916 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".epub"), ED2KFT_DOCUMENT
)); // EBook File
917 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".hlp"), ED2KFT_DOCUMENT
)); // Help File
918 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".htm"), ED2KFT_DOCUMENT
)); // HTML File
919 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".html"), ED2KFT_DOCUMENT
)); // HTML File
920 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".mobi"), ED2KFT_DOCUMENT
)); // EBook File
921 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".nfo"), ED2KFT_DOCUMENT
)); // Warez Information File
922 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".odp"), ED2KFT_DOCUMENT
)); // OpenDocument Presentation
923 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ods"), ED2KFT_DOCUMENT
)); // OpenDocument Spreadsheet
924 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".odt"), ED2KFT_DOCUMENT
)); // OpenDocument File
925 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".otp"), ED2KFT_DOCUMENT
)); // OpenDocument Presentation Template
926 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ott"), ED2KFT_DOCUMENT
)); // OpenDocument Template File
927 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ots"), ED2KFT_DOCUMENT
)); // OpenDocument Spreadsheet Template
928 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pdf"), ED2KFT_DOCUMENT
)); // Portable Document Format File
929 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".pps"), ED2KFT_DOCUMENT
)); // PowerPoint Slide Show
930 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ppt"), ED2KFT_DOCUMENT
)); // PowerPoint Presentation
931 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".ps"), ED2KFT_DOCUMENT
)); // PostScript File
932 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".rtf"), ED2KFT_DOCUMENT
)); // Rich Text Format File
933 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".stc"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Spreadsheet Template
934 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sti"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Presentation Template
935 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".stw"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Document Template File
936 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sxc"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Spreadsheet
937 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sxi"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Presentation
938 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".sxw"), ED2KFT_DOCUMENT
)); // OpenOffice.org 1.0 Document File
939 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".text"), ED2KFT_DOCUMENT
)); // General Text File
940 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".txt"), ED2KFT_DOCUMENT
)); // Text File
941 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".wri"), ED2KFT_DOCUMENT
)); // Windows Write Document
942 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xls"), ED2KFT_DOCUMENT
)); // Microsoft Excel Spreadsheet
943 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xlt"), ED2KFT_DOCUMENT
)); // Microsoft Excel Template
944 ED2KFileTypesMap
.insert(SED2KFileTypeMapElement(wxT(".xml"), ED2KFT_DOCUMENT
)); // XML File
949 // get the list initialized *before* any code is accessing it
950 CED2KFileTypes theED2KFileTypes
;
952 EED2KFileType
GetED2KFileTypeID(const CPath
& fileName
)
954 const wxString ext
= fileName
.GetExt().Lower();
959 SED2KFileTypeMap::iterator it
= ED2KFileTypesMap
.find(wxT(".") + ext
);
960 if (it
!= ED2KFileTypesMap
.end()) {
961 return it
->second
.GetType();
968 // Retuns the ed2k file type term which is to be used in server searches
969 wxString
GetED2KFileTypeSearchTerm(EED2KFileType iFileID
)
971 if (iFileID
== ED2KFT_AUDIO
) return ED2KFTSTR_AUDIO
;
972 if (iFileID
== ED2KFT_VIDEO
) return ED2KFTSTR_VIDEO
;
973 if (iFileID
== ED2KFT_IMAGE
) return ED2KFTSTR_IMAGE
;
974 if (iFileID
== ED2KFT_DOCUMENT
) return ED2KFTSTR_DOCUMENT
;
975 if (iFileID
== ED2KFT_PROGRAM
) return ED2KFTSTR_PROGRAM
;
976 // NOTE: Archives and CD-Images are published with file type "Pro"
977 if (iFileID
== ED2KFT_ARCHIVE
) return ED2KFTSTR_PROGRAM
;
978 if (iFileID
== ED2KFT_CDIMAGE
) return ED2KFTSTR_PROGRAM
;
980 return wxEmptyString
;
984 // Returns a file type which is used eMule internally only, examining the extention of the given filename
985 wxString
GetFileTypeByName(const CPath
& fileName
)
987 EED2KFileType iFileType
= GetED2KFileTypeID(fileName
);
989 case ED2KFT_AUDIO
: return ED2KFTSTR_AUDIO
;
990 case ED2KFT_VIDEO
: return ED2KFTSTR_VIDEO
;
991 case ED2KFT_IMAGE
: return ED2KFTSTR_IMAGE
;
992 case ED2KFT_DOCUMENT
: return ED2KFTSTR_DOCUMENT
;
993 case ED2KFT_PROGRAM
: return ED2KFTSTR_PROGRAM
;
994 case ED2KFT_ARCHIVE
: return ED2KFTSTR_ARCHIVE
;
995 case ED2KFT_CDIMAGE
: return ED2KFTSTR_CDIMAGE
;
996 default: return wxEmptyString
;
1001 // Retuns the ed2k file type integer ID which is to be used for publishing+searching
1002 EED2KFileType
GetED2KFileTypeSearchID(EED2KFileType iFileID
)
1005 case ED2KFT_AUDIO
: return ED2KFT_AUDIO
;
1006 case ED2KFT_VIDEO
: return ED2KFT_VIDEO
;
1007 case ED2KFT_IMAGE
: return ED2KFT_IMAGE
;
1008 case ED2KFT_DOCUMENT
: return ED2KFT_DOCUMENT
;
1009 case ED2KFT_PROGRAM
: return ED2KFT_PROGRAM
;
1010 // NOTE: Archives and CD-Images are published+searched with file type "Pro"
1011 // NOTE: If this gets changed, the function 'GetED2KFileTypeSearchTerm' also needs to get updated!
1012 case ED2KFT_ARCHIVE
: return ED2KFT_PROGRAM
;
1013 case ED2KFT_CDIMAGE
: return ED2KFT_PROGRAM
;
1014 default: return ED2KFT_ANY
;
1020 * Dumps a buffer to a wxString
1022 wxString
DumpMemToStr(const void *buff
, int n
, const wxString
& msg
, bool ok
)
1024 const unsigned char *p
= (const unsigned char *)buff
;
1025 int lines
= (n
+ 15)/ 16;
1028 // Allocate aproximetly what is needed
1029 result
.Alloc( ( lines
+ 1 ) * 80 );
1030 if ( !msg
.IsEmpty() ) {
1031 result
+= msg
+ wxT(" - ok=") + ( ok
? wxT("true, ") : wxT("false, ") );
1034 result
+= CFormat(wxT("%d bytes\n")) % n
;
1035 for ( int i
= 0; i
< lines
; ++i
) {
1037 result
+= CFormat(wxT("%08x ")) % (i
* 16);
1039 // Show two columns of hex-values
1040 for ( int j
= 0; j
< 2; ++j
) {
1041 for ( int k
= 0; k
< 8; ++k
) {
1042 int pos
= 16 * i
+ 8 * j
+ k
;
1045 result
+= CFormat(wxT("%02x ")) % p
[pos
];
1053 // Show a column of ascii-values
1054 for ( int k
= 0; k
< 16; ++k
) {
1055 int pos
= 16 * i
+ k
;
1058 if ( isspace( p
[pos
] ) ) {
1060 } else if ( !isgraph( p
[pos
] ) ) {
1063 result
+= (wxChar
)p
[pos
];
1069 result
+= wxT("|\n");
1078 * Dumps a buffer to stdout
1080 void DumpMem(const void *buff
, int n
, const wxString
& msg
, bool ok
)
1082 printf("%s\n", (const char*)unicode2char(DumpMemToStr( buff
, n
, msg
, ok
)) );
1087 // Dump mem in dword format
1088 void DumpMem_DW(const uint32
*ptr
, int count
)
1090 for(int i
= 0; i
< count
; i
++) {
1091 printf("%08x ", ptr
[i
]);
1092 if ( (i
% 4) == 3) printf("\n");
1098 wxString
GetConfigDir(const wxString
&configFileBase
)
1100 wxString configPath
;
1102 // "Portable aMule" - Use aMule from an external USB drive
1103 // Check for ./config/amule.conf (or whatever gets passed as configFile)
1104 // and use this configuration if found
1105 const wxString configDir
= JoinPaths(wxFileName::GetCwd(), wxT("config"));
1106 const wxString configFile
= JoinPaths(configDir
, configFileBase
);
1108 if (CPath::DirExists(configDir
) && CPath::FileExists(configFile
)) {
1109 AddLogLineN(CFormat(_("Using config dir: %s")) % configDir
);
1111 configPath
= configDir
;
1113 configPath
= wxStandardPaths::Get().GetUserDataDir();
1116 configPath
+= wxFileName::GetPathSeparator();
1122 /*************************** Locale specific stuff ***************************/
1125 # define SETWINLANG(LANG, SUBLANG)
1127 # define SETWINLANG(LANG, SUBLANG) \
1128 info.WinLang = LANG; \
1129 info.WinSublang = SUBLANG;
1132 #define CUSTOMLANGUAGE(wxid, iso, winlang, winsublang, dir, desc) \
1133 info.Language = wxid; \
1134 info.CanonicalName = wxT(iso); \
1135 info.LayoutDirection = dir; \
1136 info.Description = wxT(desc); \
1137 SETWINLANG(winlang, winsublang) \
1138 wxLocale::AddLanguage(info);
1140 void InitCustomLanguages()
1142 wxLanguageInfo info
;
1144 #if !wxCHECK_VERSION(2, 9, 0)
1145 CUSTOMLANGUAGE(wxLANGUAGE_ASTURIAN
, "ast", 0, 0, wxLayout_LeftToRight
, "Asturian");
1150 void InitLocale(wxLocale
& locale
, int language
)
1152 locale
.Init(language
, wxLOCALE_LOAD_DEFAULT
);
1154 #if defined(__WXMAC__) || defined(__WINDOWS__ )
1155 locale
.AddCatalogLookupPathPrefix(JoinPaths(wxStandardPaths::Get().GetDataDir(), wxT("locale")));
1157 locale
.AddCatalog(wxT(PACKAGE
));
1161 int StrLang2wx(const wxString
& language
)
1163 // get rid of possible encoding and modifier
1164 wxString
lang(language
.BeforeFirst('.').BeforeFirst('@'));
1166 if (!lang
.IsEmpty()) {
1167 const wxLanguageInfo
*lng
= wxLocale::FindLanguageInfo(lang
);
1169 int langID
= lng
->Language
;
1170 // Traditional Chinese: original Chinese, used in Taiwan, Hong Kong and Macau.
1171 // Simplified Chinese: simplified Chinese characters used in Mainland China since 1950s, and in some other places such as Singapore and Malaysia.
1173 // Chinese (Traditional) contains zh_TW, zh_HK and zh_MO (but there are differences in some words).
1174 // Because of most Traditional Chinese user are in Taiwan, zh_TW becomes the representation of Traditional Chinese.
1175 // Chinese (Simplified) contains zh_CN, zh_SG and zh_MY. In the same reason, zh_CN becomes the representation of Simplified Chinese.
1176 // (see http://forum.amule.org/index.php?topic=13208.msg98043#msg98043 )
1178 // wx maps "Traditional Chinese" to "Chinese" however. This must me corrected:
1179 if (langID
== wxLANGUAGE_CHINESE
) {
1180 langID
= wxLANGUAGE_CHINESE_TRADITIONAL
;
1184 return wxLANGUAGE_DEFAULT
;
1187 return wxLANGUAGE_DEFAULT
;
1192 wxString
wxLang2Str(const int lang
)
1194 if (lang
!= wxLANGUAGE_DEFAULT
) {
1195 const wxLanguageInfo
*lng
= wxLocale::GetLanguageInfo(lang
);
1197 return lng
->CanonicalName
;
1199 return wxEmptyString
;
1202 return wxEmptyString
;
1206 /*****************************************************************************/
1208 CMD4Hash
GetPassword(bool allowEmptyPassword
)
1210 wxString pass_plain
;
1213 pass_plain
= char2unicode(getpass("Enter password for mule connection: "));
1215 //#warning This way, pass enter is not hidden on windows. Bad thing.
1217 // Though fflush() on an input stream is undefined behaviour by the standard,
1218 // the MSVCRT version does seem to clear the input buffers.
1219 // cppcheck-suppress fflushOnInputStream
1221 printf("Enter password for mule connection: \n");
1223 fgets(temp_str
, 512, stdin
);
1224 temp_str
[strlen(temp_str
)-1] = '\0';
1225 pass_plain
= char2unicode(temp_str
);
1227 wxCHECK2(password
.Decode(MD5Sum(pass_plain
).GetHash()), /* Do nothing. */ );
1228 if (!allowEmptyPassword
) {
1229 // MD5 hash for an empty string, according to rfc1321.
1230 if (password
.Encode() == wxT("D41D8CD98F00B204E9800998ECF8427E")) {
1231 printf("No empty password allowed.\n");
1232 return GetPassword(false);
1240 const uint8
BitVector::s_posMask
[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
1241 const uint8
BitVector::s_negMask
[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
1243 // File_checked_for_headers