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
27struct _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
41G_DEFINE_BOXED_TYPE(WebKitMimeInfo, webkit_mime_info, webkit_mime_info_ref, webkit_mime_info_unref)
42
43WebKitMimeInfo* 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 */
59WebKitMimeInfo* 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 */
74void 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 */
88const 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 */
106const 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 */
128const 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