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 }