1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004-2021 musikcube team
4 //
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 //
10 //    * Redistributions of source code must retain the above copyright notice,
11 //      this list of conditions and the following disclaimer.
12 //
13 //    * Redistributions in binary form must reproduce the above copyright
14 //      notice, this list of conditions and the following disclaimer in the
15 //      documentation and/or other materials provided with the distribution.
16 //
17 //    * Neither the name of the author nor the names of other contributors may
18 //      be used to endorse or promote products derived from this software
19 //      without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 // POSSIBILITY OF SUCH DAMAGE.
32 //
33 //////////////////////////////////////////////////////////////////////////////
34 
35 #include "Utility.h"
36 #include <string.h>
37 #include <musikcore/sdk/String.h>
38 #include <musikcore/sdk/Filesystem.h>
39 
40 #ifdef WIN32
41 #include <Windows.h>
42 #endif
43 
44 using namespace musik::core::sdk;
45 
isFileTypeSupported(const char * type)46 bool isFileTypeSupported(const char* type) {
47     const char* actualType = strlen(type) && type[0] == '.' ? &type[1] : type;
48     return openmpt_is_extension_supported(actualType);
49 }
50 
isFileSupported(const std::string & filename)51 bool isFileSupported(const std::string& filename) {
52     return isFileTypeSupported(fs::getFileExtension(filename).c_str());
53 }
54 
fileToByteArray(const std::string & path,char ** target,int & size)55 bool fileToByteArray(const std::string& path, char** target, int& size) {
56 #ifdef WIN32
57     std::wstring u16fn = str::u8to16(path.c_str());
58     FILE* file = _wfopen(u16fn.c_str(), L"rb");
59 #else
60     FILE* file = fopen(path.c_str(), "rb");
61 #endif
62 
63     *target = nullptr;
64     size = 0;
65 
66     if (!file) {
67         return false;
68     }
69 
70     bool success = false;
71 
72     if (fseek(file, 0L, SEEK_END) == 0) {
73         long fileSize = ftell(file);
74         if (fileSize == -1) {
75             goto close_and_return;
76         }
77 
78         if (fseek(file, 0L, SEEK_SET) != 0) {
79             goto close_and_return;
80         }
81 
82         *target = (char*)malloc(sizeof(char) * fileSize);
83         size = fread(*target, sizeof(char), fileSize, file);
84 
85         if (size == fileSize) {
86             success = true;
87         }
88     }
89 
90 close_and_return:
91     fclose(file);
92 
93     if (!success) {
94         free(*target);
95     }
96 
97     return success;
98 }
99 
readMetadataValue(openmpt_module * module,const char * key,const char * defaultValue)100 std::string readMetadataValue(openmpt_module* module, const char* key, const char* defaultValue) {
101     std::string result;
102     if (module && key && strlen(key)) {
103         const char* value = openmpt_module_get_metadata(module, key);
104         if (value) {
105             result = value;
106             openmpt_free_string(value);
107         }
108     }
109     if (!result.size() && defaultValue) {
110         result = defaultValue;
111     }
112     return result;
113 }
114 
createSchema()115 ISchema* createSchema() {
116     auto schema = new musik::core::sdk::TSchema<>();
117     schema->AddString(KEY_DEFAULT_ALBUM_NAME, DEFAULT_ALBUM_NAME);
118     schema->AddString(KEY_DEFAULT_ARTIST_NAME, DEFAULT_ARTIST_NAME);
119     return schema;
120 }