WebKitFileChooserRequest.cpp [plain text]
#include "config.h"
#include "WebKitFileChooserRequest.h"
#include "WebKitFileChooserRequestPrivate.h"
#include "WebOpenPanelParameters.h"
#include <WebCore/FileSystem.h>
#include <glib/gi18n-lib.h>
#include <wtf/gobject/GOwnPtr.h>
#include <wtf/gobject/GRefPtr.h>
#include <wtf/text/CString.h>
using namespace WebCore;
using namespace WebKit;
G_DEFINE_TYPE(WebKitFileChooserRequest, webkit_file_chooser_request, G_TYPE_OBJECT)
struct _WebKitFileChooserRequestPrivate {
WKRetainPtr<WKOpenPanelParametersRef> wkParameters;
WKRetainPtr<WKOpenPanelResultListenerRef> wkListener;
GRefPtr<GtkFileFilter> filter;
GRefPtr<GPtrArray> mimeTypes;
GRefPtr<GPtrArray> selectedFiles;
bool handledRequest;
};
enum {
PROP_0,
PROP_FILTER,
PROP_MIME_TYPES,
PROP_SELECT_MULTIPLE,
PROP_SELECTED_FILES,
};
static void webkit_file_chooser_request_init(WebKitFileChooserRequest* request)
{
request->priv = G_TYPE_INSTANCE_GET_PRIVATE(request, WEBKIT_TYPE_FILE_CHOOSER_REQUEST, WebKitFileChooserRequestPrivate);
new (request->priv) WebKitFileChooserRequestPrivate();
}
static void webkitFileChooserRequestFinalize(GObject* object)
{
WebKitFileChooserRequest* request = WEBKIT_FILE_CHOOSER_REQUEST(object);
if (!request->priv->handledRequest)
webkit_file_chooser_request_cancel(request);
request->priv->~WebKitFileChooserRequestPrivate();
G_OBJECT_CLASS(webkit_file_chooser_request_parent_class)->finalize(object);
}
static void webkitFileChooserRequestGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
WebKitFileChooserRequest* request = WEBKIT_FILE_CHOOSER_REQUEST(object);
switch (propId) {
case PROP_FILTER:
g_value_set_object(value, webkit_file_chooser_request_get_mime_types_filter(request));
break;
case PROP_MIME_TYPES:
g_value_set_boxed(value, webkit_file_chooser_request_get_mime_types(request));
break;
case PROP_SELECT_MULTIPLE:
g_value_set_boolean(value, webkit_file_chooser_request_get_select_multiple(request));
break;
case PROP_SELECTED_FILES:
g_value_set_boxed(value, webkit_file_chooser_request_get_selected_files(request));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
break;
}
}
static void webkit_file_chooser_request_class_init(WebKitFileChooserRequestClass* requestClass)
{
GObjectClass* objectClass = G_OBJECT_CLASS(requestClass);
objectClass->finalize = webkitFileChooserRequestFinalize;
objectClass->get_property = webkitFileChooserRequestGetProperty;
g_type_class_add_private(requestClass, sizeof(WebKitFileChooserRequestPrivate));
g_object_class_install_property(objectClass,
PROP_FILTER,
g_param_spec_object("filter",
_("MIME types filter"),
_("The filter currently associated with the request"),
GTK_TYPE_FILE_FILTER,
WEBKIT_PARAM_READABLE));
g_object_class_install_property(objectClass,
PROP_MIME_TYPES,
g_param_spec_boxed("mime-types",
_("MIME types"),
_("The list of MIME types associated with the request"),
G_TYPE_STRV,
WEBKIT_PARAM_READABLE));
g_object_class_install_property(objectClass,
PROP_SELECT_MULTIPLE,
g_param_spec_boolean("select-multiple",
_("Select multiple files"),
_("Whether the file chooser should allow selecting multiple files"),
FALSE,
WEBKIT_PARAM_READABLE));
g_object_class_install_property(objectClass,
PROP_SELECTED_FILES,
g_param_spec_boxed("selected-files",
_("Selected files"),
_("The list of selected files associated with the request"),
G_TYPE_STRV,
WEBKIT_PARAM_READABLE));
}
WebKitFileChooserRequest* webkitFileChooserRequestCreate(WKOpenPanelParametersRef wkParameters, WKOpenPanelResultListenerRef wkListener)
{
WebKitFileChooserRequest* request = WEBKIT_FILE_CHOOSER_REQUEST(g_object_new(WEBKIT_TYPE_FILE_CHOOSER_REQUEST, NULL));
request->priv->wkParameters = wkParameters;
request->priv->wkListener = wkListener;
return request;
}
const gchar* const* webkit_file_chooser_request_get_mime_types(WebKitFileChooserRequest* request)
{
g_return_val_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request), 0);
if (request->priv->mimeTypes)
return reinterpret_cast<gchar**>(request->priv->mimeTypes->pdata);
WKRetainPtr<WKArrayRef> wkMimeTypes(AdoptWK, WKOpenPanelParametersCopyAcceptedMIMETypes(request->priv->wkParameters.get()));
size_t numOfMimeTypes = WKArrayGetSize(wkMimeTypes.get());
if (!numOfMimeTypes)
return 0;
request->priv->mimeTypes = adoptGRef(g_ptr_array_new_with_free_func(g_free));
for (size_t i = 0; i < numOfMimeTypes; ++i) {
WKStringRef wkMimeType = static_cast<WKStringRef>(WKArrayGetItemAtIndex(wkMimeTypes.get(), i));
String mimeTypeString = toImpl(wkMimeType)->string();
if (mimeTypeString.isEmpty())
continue;
g_ptr_array_add(request->priv->mimeTypes.get(), g_strdup(mimeTypeString.utf8().data()));
}
g_ptr_array_add(request->priv->mimeTypes.get(), 0);
return reinterpret_cast<gchar**>(request->priv->mimeTypes->pdata);
}
GtkFileFilter* webkit_file_chooser_request_get_mime_types_filter(WebKitFileChooserRequest* request)
{
g_return_val_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request), 0);
if (request->priv->filter)
return request->priv->filter.get();
WKRetainPtr<WKArrayRef> wkMimeTypes(AdoptWK, WKOpenPanelParametersCopyAcceptedMIMETypes(request->priv->wkParameters.get()));
size_t numOfMimeTypes = WKArrayGetSize(wkMimeTypes.get());
if (!numOfMimeTypes)
return 0;
request->priv->filter = gtk_file_filter_new();
for (size_t i = 0; i < numOfMimeTypes; ++i) {
WKStringRef wkMimeType = static_cast<WKStringRef>(WKArrayGetItemAtIndex(wkMimeTypes.get(), i));
String mimeTypeString = toImpl(wkMimeType)->string();
if (mimeTypeString.isEmpty())
continue;
gtk_file_filter_add_mime_type(request->priv->filter.get(), mimeTypeString.utf8().data());
}
return request->priv->filter.get();
}
gboolean webkit_file_chooser_request_get_select_multiple(WebKitFileChooserRequest* request)
{
g_return_val_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request), FALSE);
return WKOpenPanelParametersGetAllowsMultipleFiles(request->priv->wkParameters.get());
}
void webkit_file_chooser_request_select_files(WebKitFileChooserRequest* request, const gchar* const* files)
{
g_return_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request));
g_return_if_fail(files);
GRefPtr<GPtrArray> selectedFiles = adoptGRef(g_ptr_array_new_with_free_func(g_free));
WKRetainPtr<WKMutableArrayRef> wkChosenFiles(AdoptWK, WKMutableArrayCreate());
for (int i = 0; files[i]; i++) {
GRefPtr<GFile> filename = adoptGRef(g_file_new_for_path(files[i]));
GOwnPtr<char> uri(g_file_get_uri(filename.get()));
WKRetainPtr<WKURLRef> wkURL(AdoptWK, WKURLCreateWithUTF8CString(uri.get()));
WKArrayAppendItem(wkChosenFiles.get(), wkURL.get());
g_ptr_array_add(selectedFiles.get(), g_strdup(files[i]));
}
g_ptr_array_add(selectedFiles.get(), 0);
WKOpenPanelResultListenerChooseFiles(request->priv->wkListener.get(), wkChosenFiles.get());
request->priv->selectedFiles = selectedFiles;
request->priv->handledRequest = true;
}
const gchar* const* webkit_file_chooser_request_get_selected_files(WebKitFileChooserRequest* request)
{
g_return_val_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request), 0);
if (request->priv->selectedFiles)
return reinterpret_cast<gchar**>(request->priv->selectedFiles->pdata);
const Vector<String> selectedFileNames = toImpl(request->priv->wkParameters.get())->selectedFileNames();
size_t numOfFiles = selectedFileNames.size();
if (!numOfFiles)
return 0;
request->priv->selectedFiles = adoptGRef(g_ptr_array_new_with_free_func(g_free));
for (size_t i = 0; i < numOfFiles; ++i) {
if (selectedFileNames[i].isEmpty())
continue;
CString filename = fileSystemRepresentation(selectedFileNames[i]);
g_ptr_array_add(request->priv->selectedFiles.get(), g_strdup(filename.data()));
}
g_ptr_array_add(request->priv->selectedFiles.get(), 0);
return reinterpret_cast<gchar**>(request->priv->selectedFiles->pdata);
}
void webkit_file_chooser_request_cancel(WebKitFileChooserRequest* request)
{
g_return_if_fail(WEBKIT_IS_FILE_CHOOSER_REQUEST(request));
WKOpenPanelResultListenerCancel(request->priv->wkListener.get());
request->priv->handledRequest = true;
}