aboutsummaryrefslogtreecommitdiffstats
path: root/camel/data-wrapper-repository.c
blob: f433383b8512d1b5b05fa261fba3877943629e29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */

/* 
 *
 * Author : 
 *  Bertrand Guiheneuf <bertrand@helixcode.com>
 *
 * Copyright 1999, 2000 Helix Code, Inc. (http://www.helixcode.com)
 *
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License as 
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 */


#include "data-wrapper-repository.h"
#include "camel-simple-data-wrapper.h"
#include "camel-mime-message.h"
#include "camel-multipart.h"
#include <string.h>
#include "hash-table-utils.h"

static DataWrapperRepository _repository;
static int _initialized = -1;
GMimeContentField *_content_field;


/**
 * data_wrapper_repository_init: initialize data wrapper repository 
 * 
 * initialize the data wrapper repository. When the repository has
 * already been initialized, returns -1. 
 * 
 * Return value: 1 if correctly initialized returns -1.
 **/
gint 
data_wrapper_repository_init ()
{
    if (_initialized != -1) return -1;
    _repository.mime_links = g_hash_table_new (g_strcase_hash, g_strcase_equal);
    data_wrapper_repository_set_data_wrapper_type ("multipart", camel_multipart_get_type());

    /* this is a temporary default so that Michael can use get_stream on text messages  */
    data_wrapper_repository_set_data_wrapper_type ("text", camel_simple_data_wrapper_get_type());

    /* this is for matt the great lopper */
    data_wrapper_repository_set_data_wrapper_type ("message/rfc822", camel_mime_message_get_type());
    _content_field = gmime_content_field_new (NULL, NULL);
    _initialized = 1;
    return 1;
}

/**
 * data_wrapper_repository_set_data_wrapper_type: associate a data wrapper object type to a mime type
 * @mime_type: mime type
 * @object_type: object type
 * 
 * Associate an object type to a mime type. 
 **/
void
data_wrapper_repository_set_data_wrapper_type (const gchar *mime_type, GtkType object_type)
{
    gboolean already_exists;
    gchar *old_mime_type;
    GtkType old_gtk_type;
    
    already_exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)mime_type,
                               (gpointer)&old_mime_type, (gpointer)&old_gtk_type);
    if (already_exists) 
        g_hash_table_insert (_repository.mime_links, (gpointer)old_mime_type, (gpointer)object_type);
    else
        g_hash_table_insert (_repository.mime_links, (gpointer)g_strdup (mime_type), (gpointer)object_type);
}



/**
 * data_wrapper_repository_get_data_wrapper_type: get the gtk type object associated to a mime type
 * @mime_type: mime type
 * 
 * returns the GtkType of the data wrapper object associated to 
 * a particular mime type. The mime type must be a character string
 * of the form "type/subtype" or simply "type". When the complete
 * mime type ("type/subtype") is not associated to any particular 
 * data wrapper object, this routine looks for a default data wrapper
 * for the main mime type ("type"). When no particular association is
 * found for this mime type, the type of the SimpleDataWrapper is 
 * returned. 
 * 
 * 
 * Return value: the associated data wrapper object type.
 **/
GtkType 
data_wrapper_repository_get_data_wrapper_type (const gchar *mime_type)
{
    gboolean exists;
    gchar *old_mime_type;
    GtkType gtk_type;

    /* find if the complete mime type exists */
    exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)mime_type,
                               (gpointer)&old_mime_type, (gpointer)&gtk_type);
    if (exists) { /* the complete mime type exists, return it */
        return gtk_type;
    } else { 
        /* the complete mime type association does not exists */
        /* is there an association for the main mime type ?   */
        gmime_content_field_construct_from_string (_content_field, mime_type);
        exists = g_hash_table_lookup_extended (_repository.mime_links, (gpointer)(_content_field->type),
                               (gpointer)&old_mime_type, (gpointer)&gtk_type);
        
        if (exists) /* the main mime type association exists */
            return gtk_type;
        else
            return camel_simple_data_wrapper_get_type();
    }

            
        

}