|
Packit Service |
de44cd |
/*
|
|
Packit Service |
de44cd |
* Copyright (C) 2016 Red Hat, Inc. (www.redhat.com)
|
|
Packit Service |
de44cd |
*
|
|
Packit Service |
de44cd |
* This library is free software: you can redistribute it and/or modify it
|
|
Packit Service |
de44cd |
* under the terms of the GNU Lesser General Public License as published by
|
|
Packit Service |
de44cd |
* the Free Software Foundation.
|
|
Packit Service |
de44cd |
*
|
|
Packit Service |
de44cd |
* This library is distributed in the hope that it will be useful, but
|
|
Packit Service |
de44cd |
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
Packit Service |
de44cd |
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
Packit Service |
de44cd |
* for more details.
|
|
Packit Service |
de44cd |
*
|
|
Packit Service |
de44cd |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit Service |
de44cd |
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
de44cd |
*/
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
#include "evolution-config.h"
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
#include <stdio.h>
|
|
Packit Service |
de44cd |
#include <string.h>
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
#include "e-mail-display.h"
|
|
Packit Service |
de44cd |
#include "e-cid-request.h"
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
struct _ECidRequestPrivate {
|
|
Packit Service |
de44cd |
gint dummy;
|
|
Packit Service |
de44cd |
};
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static void e_cid_request_content_request_init (EContentRequestInterface *iface);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
G_DEFINE_TYPE_WITH_CODE (ECidRequest, e_cid_request, G_TYPE_OBJECT,
|
|
Packit Service |
de44cd |
G_IMPLEMENT_INTERFACE (E_TYPE_CONTENT_REQUEST, e_cid_request_content_request_init))
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static gboolean
|
|
Packit Service |
de44cd |
e_cid_request_can_process_uri (EContentRequest *request,
|
|
Packit Service |
de44cd |
const gchar *uri)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
g_return_val_if_fail (E_IS_CID_REQUEST (request), FALSE);
|
|
Packit Service |
de44cd |
g_return_val_if_fail (uri != NULL, FALSE);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
return g_ascii_strncasecmp (uri, "cid:", 4) == 0;
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static gboolean
|
|
Packit Service |
de44cd |
e_cid_request_process_sync (EContentRequest *request,
|
|
Packit Service |
de44cd |
const gchar *uri,
|
|
Packit Service |
de44cd |
GObject *requester,
|
|
Packit Service |
de44cd |
GInputStream **out_stream,
|
|
Packit Service |
de44cd |
gint64 *out_stream_length,
|
|
Packit Service |
de44cd |
gchar **out_mime_type,
|
|
Packit Service |
de44cd |
GCancellable *cancellable,
|
|
Packit Service |
de44cd |
GError **error)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
EMailDisplay *display;
|
|
Packit Service |
de44cd |
EMailPartList *part_list;
|
|
Packit Service |
de44cd |
EMailPart *part;
|
|
Packit Service |
de44cd |
GByteArray *byte_array;
|
|
Packit Service |
de44cd |
CamelStream *output_stream;
|
|
Packit Service |
de44cd |
CamelDataWrapper *dw;
|
|
Packit Service |
de44cd |
CamelMimePart *mime_part;
|
|
Packit Service |
de44cd |
gboolean success = FALSE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
g_return_val_if_fail (E_IS_CID_REQUEST (request), FALSE);
|
|
Packit Service |
de44cd |
g_return_val_if_fail (uri != NULL, FALSE);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
if (g_cancellable_set_error_if_cancelled (cancellable, error))
|
|
Packit Service |
de44cd |
return FALSE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
if (!E_IS_MAIL_DISPLAY (requester))
|
|
Packit Service |
de44cd |
return FALSE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
display = E_MAIL_DISPLAY (requester);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
part_list = e_mail_display_get_part_list (display);
|
|
Packit Service |
de44cd |
if (!part_list)
|
|
Packit Service |
de44cd |
return FALSE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
part = e_mail_part_list_ref_part (part_list, uri);
|
|
Packit Service |
de44cd |
if (!part)
|
|
Packit Service |
de44cd |
return FALSE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
mime_part = e_mail_part_ref_mime_part (part);
|
|
Packit Service |
de44cd |
dw = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
g_return_val_if_fail (dw != NULL, FALSE);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
byte_array = g_byte_array_new ();
|
|
Packit Service |
de44cd |
output_stream = camel_stream_mem_new ();
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
/* We retain ownership of the byte array. */
|
|
Packit Service |
de44cd |
camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (output_stream), byte_array);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
if (camel_data_wrapper_decode_to_stream_sync (dw, output_stream, cancellable, error)) {
|
|
Packit Service |
de44cd |
GBytes *bytes;
|
|
Packit Service |
de44cd |
gchar *mime_type;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
bytes = g_byte_array_free_to_bytes (byte_array);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
success = TRUE;
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
*out_stream = g_memory_input_stream_new_from_bytes (bytes);
|
|
Packit Service |
de44cd |
*out_stream_length = g_bytes_get_size (bytes);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
mime_type = camel_data_wrapper_get_mime_type (dw);
|
|
Packit Service |
de44cd |
if (mime_type && *mime_type)
|
|
Packit Service |
de44cd |
*out_mime_type = mime_type;
|
|
Packit Service |
de44cd |
else {
|
|
Packit Service |
de44cd |
g_free (mime_type);
|
|
Packit Service |
de44cd |
*out_mime_type = g_strdup (e_mail_part_get_mime_type (part));
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
g_bytes_unref (bytes);
|
|
Packit Service |
de44cd |
} else {
|
|
Packit Service |
de44cd |
g_byte_array_free (byte_array, TRUE);
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
g_object_unref (output_stream);
|
|
Packit Service |
de44cd |
g_object_unref (mime_part);
|
|
Packit Service |
de44cd |
g_object_unref (part);
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
return success;
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static void
|
|
Packit Service |
de44cd |
e_cid_request_content_request_init (EContentRequestInterface *iface)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
iface->can_process_uri = e_cid_request_can_process_uri;
|
|
Packit Service |
de44cd |
iface->process_sync = e_cid_request_process_sync;
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static void
|
|
Packit Service |
de44cd |
e_cid_request_class_init (ECidRequestClass *class)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
g_type_class_add_private (class, sizeof (ECidRequestPrivate));
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
static void
|
|
Packit Service |
de44cd |
e_cid_request_init (ECidRequest *request)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
request->priv = G_TYPE_INSTANCE_GET_PRIVATE (request, E_TYPE_CID_REQUEST, ECidRequestPrivate);
|
|
Packit Service |
de44cd |
}
|
|
Packit Service |
de44cd |
|
|
Packit Service |
de44cd |
EContentRequest *
|
|
Packit Service |
de44cd |
e_cid_request_new (void)
|
|
Packit Service |
de44cd |
{
|
|
Packit Service |
de44cd |
return g_object_new (E_TYPE_CID_REQUEST, NULL);
|
|
Packit Service |
de44cd |
}
|