1 | /* |
2 | * Copyright (C) 2012 Igalia S.L. |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Library General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Library General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Library General Public License |
15 | * along with this library; see the file COPYING.LIB. If not, write to |
16 | * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
17 | * Boston, MA 02110-1301, USA. |
18 | */ |
19 | |
20 | #include "config.h" |
21 | #include "WebKitMimeInfo.h" |
22 | |
23 | #include "WebKitMimeInfoPrivate.h" |
24 | #include <wtf/glib/GRefPtr.h> |
25 | #include <wtf/text/CString.h> |
26 | |
27 | struct _WebKitMimeInfo { |
28 | _WebKitMimeInfo(const WebCore::MimeClassInfo& mimeInfo) |
29 | : mimeInfo(mimeInfo) |
30 | { |
31 | } |
32 | |
33 | WebCore::MimeClassInfo mimeInfo; |
34 | CString mimeType; |
35 | CString description; |
36 | GRefPtr<GPtrArray> extensions; |
37 | |
38 | int referenceCount { 0 }; |
39 | }; |
40 | |
41 | G_DEFINE_BOXED_TYPE(WebKitMimeInfo, webkit_mime_info, webkit_mime_info_ref, webkit_mime_info_unref) |
42 | |
43 | WebKitMimeInfo* webkitMimeInfoCreate(const WebCore::MimeClassInfo& mimeInfo) |
44 | { |
45 | WebKitMimeInfo* info = static_cast<WebKitMimeInfo*>(fastMalloc(sizeof(WebKitMimeInfo))); |
46 | new (info) WebKitMimeInfo(mimeInfo); |
47 | return info; |
48 | } |
49 | |
50 | /** |
51 | * webkit_mime_info_ref: |
52 | * @info: a #WebKitMimeInfo |
53 | * |
54 | * Atomically increments the reference count of @info by one. This |
55 | * function is MT-safe and may be called from any thread. |
56 | * |
57 | * Returns: The passed in #WebKitMimeInfo |
58 | */ |
59 | WebKitMimeInfo* webkit_mime_info_ref(WebKitMimeInfo* info) |
60 | { |
61 | g_atomic_int_inc(&info->referenceCount); |
62 | return info; |
63 | } |
64 | |
65 | /** |
66 | * webkit_mime_info_unref: |
67 | * @info: a #WebKitMimeInfo |
68 | * |
69 | * Atomically decrements the reference count of @info by one. If the |
70 | * reference count drops to 0, all memory allocated by the #WebKitMimeInfo is |
71 | * released. This function is MT-safe and may be called from any |
72 | * thread. |
73 | */ |
74 | void webkit_mime_info_unref(WebKitMimeInfo* info) |
75 | { |
76 | if (g_atomic_int_dec_and_test(&info->referenceCount)) { |
77 | info->~WebKitMimeInfo(); |
78 | fastFree(info); |
79 | } |
80 | } |
81 | |
82 | /** |
83 | * webkit_mime_info_get_mime_type: |
84 | * @info: a #WebKitMimeInfo |
85 | * |
86 | * Returns: the MIME type of @info |
87 | */ |
88 | const char* webkit_mime_info_get_mime_type(WebKitMimeInfo* info) |
89 | { |
90 | if (!info->mimeType.isNull()) |
91 | return info->mimeType.data(); |
92 | |
93 | if (info->mimeInfo.type.isEmpty()) |
94 | return 0; |
95 | |
96 | info->mimeType = info->mimeInfo.type.utf8(); |
97 | return info->mimeType.data(); |
98 | } |
99 | |
100 | /** |
101 | * webkit_mime_info_get_description: |
102 | * @info: a #WebKitMimeInfo |
103 | * |
104 | * Returns: the description of the MIME type of @info |
105 | */ |
106 | const char* webkit_mime_info_get_description(WebKitMimeInfo* info) |
107 | { |
108 | if (!info->description.isNull()) |
109 | return info->description.data(); |
110 | |
111 | if (info->mimeInfo.desc.isEmpty()) |
112 | return 0; |
113 | |
114 | info->description = info->mimeInfo.desc.utf8(); |
115 | return info->description.data(); |
116 | } |
117 | |
118 | /** |
119 | * webkit_mime_info_get_extensions: |
120 | * @info: a #WebKitMimeInfo |
121 | * |
122 | * Get the list of file extensions associated to the |
123 | * MIME type of @info |
124 | * |
125 | * Returns: (array zero-terminated=1) (transfer none): a |
126 | * %NULL-terminated array of strings |
127 | */ |
128 | const char* const* webkit_mime_info_get_extensions(WebKitMimeInfo* info) |
129 | { |
130 | if (info->extensions) |
131 | return reinterpret_cast<gchar**>(info->extensions->pdata); |
132 | |
133 | if (info->mimeInfo.extensions.isEmpty()) |
134 | return 0; |
135 | |
136 | info->extensions = adoptGRef(g_ptr_array_new_with_free_func(g_free)); |
137 | for (size_t i = 0; i < info->mimeInfo.extensions.size(); ++i) { |
138 | if (info->mimeInfo.extensions[i].isEmpty()) |
139 | continue; |
140 | g_ptr_array_add(info->extensions.get(), g_strdup(info->mimeInfo.extensions[i].utf8().data())); |
141 | } |
142 | g_ptr_array_add(info->extensions.get(), 0); |
143 | |
144 | return reinterpret_cast<gchar**>(info->extensions->pdata); |
145 | } |
146 | |