2 // This file is part of the aMule Project.
4 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2008 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 #ifndef OTHERFUNCTIONS_H
27 #define OTHERFUNCTIONS_H
29 #include <wx/intl.h> // Needed for wxLANGUAGE_ constants
31 #include "Types.h" // Needed for uint16, uint32 and uint64
33 #include <algorithm> // Needed for std::for_each // Do_not_auto_remove (mingw-gcc-3.4.5)
42 * @param ArgA The base value.
43 * @param ArgB The value to compare ArgA against.
46 * Use this function to safely compare two arguments of a type that supports
47 * the "<" operator. It works like strcmp and returns a negative value if ArgA
48 * is less than ArgB, zero if ArgA is equal to ArgB and a positive value if
49 * ArgA is greater than ArgB.
52 int CmpAny(const TYPE
& ArgA
, const TYPE
& ArgB
)
56 } else if ( ArgB
< ArgA
) {
63 //! Overloaded version of CmpAny for use with wxStrings.
64 inline int CmpAny(const wxString
& ArgA
, const wxString
& ArgB
)
66 return ArgA
.CmpNoCase( ArgB
);
69 //! Overloaded version of CmpAny for use with C-Strings (Unicoded).
70 inline int CmpAny(const wxChar
* ArgA
, const wxChar
* ArgB
)
72 return wxString( ArgA
).CmpNoCase( ArgB
);
77 * Removes the first instance of a value from a STL-like list: list, vector or deque.
79 * @param list The list to manipulate.
80 * @param item The value to search for and remove.
81 * @return The number of instances removed.
83 template <typename LIST
, typename ITEM
>
84 unsigned int EraseFirstValue( LIST
& list
, const ITEM
& item
)
86 typename
LIST::iterator it
= list
.begin();
88 for (; it
!= list
.end(); ++it
) {
101 * Removes all instances of a value from a STL-like list: list, vector or deque.
103 * @param list The list to manipulate.
104 * @param item The value to search for and remove.
105 * @return The number of instances removed.
107 template <typename LIST
, typename ITEM
>
108 unsigned int EraseValue( LIST
& list
, const ITEM
& item
)
110 typename
LIST::iterator it
= list
.begin();
111 unsigned int count
= 0;
113 for ( ; it
!= list
.end(); ) {
115 it
= list
.erase( it
);
126 //! Used by DeleteContents
129 // Used for lists, vectors, deques, etc.
130 template <typename TYPE
>
131 void operator()(TYPE
* ptr
) {
135 // Used for maps, hashmaps, rangemaps, etc.
136 template <typename FIRST
, typename SECOND
>
137 void operator()(const std::pair
<FIRST
, SECOND
>& pair
) {
143 /** Frees the contents of a list or map like stl container, clearing it afterwards. */
144 template <typename STL_CONTAINER
>
145 void DeleteContents(STL_CONTAINER
& container
)
147 // Ensure that the actual container wont contain dangling pointers during
148 // this operation, to ensure that the destructors cant access them.
151 std::swap(copy
, container
);
152 std::for_each(copy
.begin(), copy
.end(), SDoDelete());
157 * Copies elements from the range [first, first + n) to the range [result, result + n).
159 template <class InputIterator
, class OutputIterator
>
160 OutputIterator
STLCopy_n(InputIterator first
, size_t n
, OutputIterator result
)
162 return std::copy(first
, first
+ n
, result
);
167 * Returns a description of the version of aMule being used.
169 * @return A detailed description of the aMule version, including wx information.
171 * Use this rather than just using the VERSION or CURRENT_VERSION_LONG
172 * constants, when displaying information to the user. The purpose is to
173 * help with debugging.
175 wxString
GetMuleVersion();
179 * Helperfunction for accessing a child of the calling widget.
181 * @param IdOrName The ID or the Name of the widget to find.
182 * @param type The widget-type to cast the found widget to.
184 * Use this function as a replacement for the following constructs:
185 * - wxStaticCast( FindWindow( <IdOrName> ), <type> )
186 * - (<type>*)FindWindow( <IdOrName> )
188 * It has the advantage of validating the cast in debug builds and being much
189 * shorter than than manually typing wxStaticCast + FindWindow. This mean that
190 * we will be alerted in case of widget changing type, instead of getting just
191 * getting bad mojo due to casting a pointer to the wrong type.
193 #define CastChild( IdOrName, type ) dynamic_cast<type*>( FindWindow( IdOrName ) )
197 * Helperfunction for accessing the child of a any widget by ID.
199 * @param ID The ID of the widget to find.
200 * @param parent The parent of the widget to find, or NULL to search from the top.
201 * @param type The type to cast the widget to.
205 #define CastByID( ID, parent, type ) dynamic_cast<type*>( wxWindow::FindWindowById( (ID), (parent) ) )
209 * Helperfunction for accessing the child of a any widget by Name.
211 * @param Name The Name of the widget to find.
212 * @param parent The parent of the widget to find, or NULL to search from the top.
213 * @param type The type to cast the widget to.
217 #define CastByName( Name, parent, type ) dynamic_cast<type*>( wxWindow::FindWindowByName( (Name), (parent) ) )
220 // From Gnucleus project [found by Tarod]
221 // Base16/Base32/Base64 Encode/Decode functions
222 wxString
EncodeBase16(const unsigned char* buffer
, unsigned int bufLen
);
223 unsigned int DecodeBase16(const wxString
&base16Buffer
, unsigned int base16BufLen
, unsigned char *buffer
);
224 wxString
EncodeBase32(const unsigned char* buffer
, unsigned int bufLen
);
225 unsigned int DecodeBase32(const wxString
&base32Buffer
, unsigned int base32BufLen
, unsigned char *buffer
);
226 wxString
EncodeBase64(const char* buffer
, unsigned int bufLen
);
227 unsigned int DecodeBase64(const wxString
&base64Buffer
, unsigned int base64BufLen
, unsigned char *buffer
);
229 // Converts the number of bytes to human readable form.
230 wxString
CastItoXBytes(uint64 count
);
231 // Converts the number to human readable form, abbreviating when nessecary.
232 wxString
CastItoIShort(uint64 number
);
233 // Converts a number of bytes to a human readable speed value.
234 wxString
CastItoSpeed(uint32 bytes
);
235 // Converts an amount of seconds to human readable time.
236 wxString
CastSecondsToHM(uint32 seconds
, uint16 msecs
= 0);
237 // Returns the amount of Bytes the provided size-type represents
238 uint32
GetTypeSize(uint8 type
);
239 // Returns the string associated with a file-rating value.
240 wxString
GetRateString(uint16 rate
);
243 // The following functions are used to identify and/or name the type of a file
244 enum FileType
{ ftAny
, ftVideo
, ftAudio
, ftArchive
, ftCDImage
, ftPicture
, ftText
, ftProgram
};
245 // Examins a filename and returns the enumerated value assosiated with it, or ftAny if unknown extension
246 FileType
GetFiletype(const CPath
& filename
);
247 // Returns the description of a filetype: Movies, Audio, Pictures and so on...
248 wxString
GetFiletypeDesc(FileType type
, bool translated
= true);
249 // Shorthand for GetFiletypeDesc(GetFiletype(filename))
250 wxString
GetFiletypeByName(const CPath
& filename
, bool translated
= true);
253 // Returns the name associated with a category value.
254 wxString
GetCatTitle(int catid
);
259 //! Returns the number of items in an array.
260 #define itemsof(x) (sizeof(x)/sizeof(x[0]))
263 ///////////////////////////////////////////////////////////////////////////////
279 class EED2KFileTypeClass
286 EED2KFileTypeClass(EED2KFileType t
)
290 EED2KFileType
GetType() const
299 EED2KFileType
GetED2KFileTypeID(const CPath
& fileName
);
300 wxString
GetED2KFileTypeSearchTerm(EED2KFileType iFileID
);
301 wxString
GetFileTypeByName(const CPath
& fileName
);
302 EED2KFileType
GetED2KFileTypeSearchID(EED2KFileType iFileID
);
303 ///////////////////////////////////////////////////////////////////////////////
305 // md4cmp -- replacement for memcmp(hash1,hash2,16)
306 // Like 'memcmp' this function returns 0, if hash1==hash2, and !0, if hash1!=hash2.
307 // NOTE: Do *NOT* use that function for determining if hash1<hash2 or hash1>hash2.
308 inline int md4cmp(const void* hash1
, const void* hash2
)
310 return memcmp(hash1
, hash2
, 16);
314 // md4clr -- replacement for memset(hash,0,16)
315 inline void md4clr(void* hash
)
321 // md4cpy -- replacement for memcpy(dst,src,16)
322 inline void md4cpy(void* dst
, const void* src
)
324 memcpy(dst
, src
, 16);
328 // DumpMem ... Dumps mem ;)
329 wxString
DumpMemToStr(const void *buff
, int n
, const wxString
& msg
= wxEmptyString
, bool ok
= true);
330 void DumpMem(const void *buff
, int n
, const wxString
& msg
= wxEmptyString
, bool ok
= true);
331 void DumpMem_DW(const uint32
*ptr
, int count
);
333 // Returns special source ID for GUI.
334 // It's actually IP<<16+Port
335 #define GUI_ID(x,y) (uint64)((((uint64)x)<<16) + (uint64)y)
337 #define PORT_FROM_GUI_ID(x) (x & 0xFFFF)
338 #define IP_FROM_GUI_ID(x) (x >> 16)
342 inline long int make_full_ed2k_version(int a
, int b
, int c
) {
343 return ((a
<< 17) | (b
<< 10) | (c
<< 7));
347 wxString
GetConfigDir(const wxString
&configFile
= wxT("amule.conf"));
349 #if !wxCHECK_VERSION(2, 9, 0)
351 wxLANGUAGE_ASTURIAN
= wxLANGUAGE_USER_DEFINED
+ 1
356 * Adds aMule's custom languages to db.
358 void InitCustomLanguages();
363 void InitLocale(wxLocale
& locale
, int language
);
366 * Converts a string locale definition to a wxLANGUAGE id.
368 int StrLang2wx(const wxString
& language
);
371 * Converts a wxLANGUAGE id to a string locale name.
373 wxString
wxLang2Str(const int lang
);
376 * Generate MD5Hash of prompt input
378 wxString
GetPassword();
383 #include <wx/thread.h>
386 * Automatically unlocks a mutex on construction and locks it on destruction.
388 * This class is the complement of wxMutexLocker. It is intended to be used
389 * when a mutex, which is locked for a period of time, needs to be
390 * temporarily unlocked for a bit. For example:
392 * wxMutexLocker lock(mutex);
394 * // ... do stuff that requires that the mutex is locked ...
397 * CMutexUnlocker unlocker(mutex);
398 * // ... do stuff that requires that the mutex is unlocked ...
401 * // ... do more stuff that requires that the mutex is locked ...
407 // unlock the mutex in the ctor
408 CMutexUnlocker(wxMutex
& mutex
)
409 : m_isOk(false), m_mutex(mutex
)
410 { m_isOk
= ( m_mutex
.Unlock() == wxMUTEX_NO_ERROR
); }
412 // returns true if mutex was successfully unlocked in ctor
416 // lock the mutex in dtor
418 { if ( IsOk() ) m_mutex
.Lock(); }
421 // no assignment operator nor copy ctor
422 CMutexUnlocker(const CMutexUnlocker
&);
423 CMutexUnlocker
& operator=(const CMutexUnlocker
&);
428 #endif /* wxUSE_THREADS */
431 #endif // OTHERFUNCTIONS_H
432 // File_checked_for_headers