nautilus-view-identifier.c 5.51 KB
Newer Older
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
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-

   nautilus-view-identifier.c: Unique ID/Human-readable name pairs for views
 
   Copyright (C) 2000 Eazel, Inc.
  
   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.
  
   Author: Maciej Stachowiak <mjs@eazel.com>
*/

#include <config.h>
#include "nautilus-view-identifier.h"

#include "nautilus-glib-extensions.h"
29
#include "nautilus-string.h"
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
#include <glib.h>
#include <stdlib.h>

NautilusViewIdentifier *
nautilus_view_identifier_new (const char *iid, const char *name)
{
        NautilusViewIdentifier *new_identifier;
        
        g_return_val_if_fail (iid != NULL, NULL);
        g_return_val_if_fail (name != NULL, NULL);
        
        new_identifier = g_new0 (NautilusViewIdentifier, 1);
        new_identifier->iid = g_strdup (iid);
        new_identifier->name = g_strdup (name);
        
        return new_identifier;
}

48
NautilusViewIdentifier *
49
nautilus_view_identifier_copy (const NautilusViewIdentifier *identifier)
50
{
51 52 53 54
	if (identifier == NULL) {
		return NULL;
	}
	
55 56 57
	return nautilus_view_identifier_new (identifier->iid, identifier->name);
}

58 59
/* Returns a list of languages, containing
   the LANG or LANGUAGE environment setting (with and without region code).
60
   The elements in the returned list must be freed */
61 62 63 64
static GSList *
get_lang_list (void)
{
        GSList *retval;
65 66
        char *lang, *lang_with_locale, *tmp, *org_pointer;
        char *equal_char;
67 68 69

        retval = NULL;

70
        tmp = g_getenv ("LANGUAGE");
71

72 73
        if (tmp == NULL) {
                tmp = g_getenv ("LANG");
74 75
        }

76 77
	lang = g_strdup (tmp);
	org_pointer = lang;
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
	if (lang != NULL) {
		/* envs can be in NAME=VALUE form */
		equal_char = strchr (lang, '=');
		if (equal_char != NULL) {
			lang = equal_char + 1;
		}
		
		/* lang may be in form LANG_LOCALE */
		equal_char = strchr (lang, '_');
		if (equal_char != NULL) {
			lang_with_locale = g_strdup (lang);
			*equal_char = 0;
		} else {
			lang_with_locale = NULL;
		}
94

95 96 97 98
		/* Make sure we don't give oaf an empty
		   lang string */
		if (!nautilus_str_is_empty (lang_with_locale)) {
			retval = g_slist_prepend (retval, 
99
						  g_strdup (lang_with_locale));
100
		}
101
		g_free (lang_with_locale);
102 103 104
		if (!nautilus_str_is_empty (lang)) {
			retval = g_slist_prepend (retval, g_strdup (lang));
		}
105
        }
106
	g_free (org_pointer);
107 108 109 110 111 112 113
        
        return retval;
}

NautilusViewIdentifier *
nautilus_view_identifier_new_from_oaf_server_info (OAF_ServerInfo *server, char *name_attribute)
{
114
        const char *view_as_name;       
115 116 117
        GSList *langs;

        langs = get_lang_list ();
118

119
        view_as_name = oaf_server_info_prop_lookup (server, name_attribute, langs);
120
        if (view_as_name == NULL) {
121
                view_as_name = oaf_server_info_prop_lookup (server, "name", langs);
122 123 124 125
        }
        if (view_as_name == NULL) {
                view_as_name = server->iid;
        }
126

127
	nautilus_g_slist_free_deep (langs);
128

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	/* if the name is an OAFIID, clean it up for display */
	if (nautilus_str_has_prefix (view_as_name, "OAFIID:")) {
		char *display_name, *colon_ptr;
		NautilusViewIdentifier *new_identifier;
		
		display_name = g_strdup (view_as_name + 7);
		colon_ptr = strchr (display_name, ':');
		if (colon_ptr) {
			*colon_ptr = '\0';
		}
		
		new_identifier = nautilus_view_identifier_new (server->iid, display_name);
		g_free(display_name);
		return new_identifier;					
	}
		
145 146 147 148 149 150
        return nautilus_view_identifier_new (server->iid, view_as_name);
}

NautilusViewIdentifier *
nautilus_view_identifier_new_from_content_view (OAF_ServerInfo *server)
{
151 152
	return nautilus_view_identifier_new_from_oaf_server_info
		(server, "nautilus:view_as_name");
153 154 155 156 157
}

NautilusViewIdentifier *
nautilus_view_identifier_new_from_sidebar_panel (OAF_ServerInfo *server)
{
158 159
	return nautilus_view_identifier_new_from_oaf_server_info
		(server, "nautilus:sidebar_panel_name");
160 161 162 163 164 165 166 167 168 169 170 171
}

void
nautilus_view_identifier_free (NautilusViewIdentifier *identifier)
{
        if (identifier != NULL) {
                g_free (identifier->iid);
                g_free (identifier->name);
                g_free (identifier);
        }
}

172 173 174 175 176 177 178 179 180 181 182 183 184
GList *
nautilus_view_identifier_list_copy (GList *list)
{
	GList *copy, *node;

	copy = NULL;
	for (node = list; node != NULL; node = node->next) {
		copy = g_list_prepend
			(copy, nautilus_view_identifier_copy (node->data));
	}
	return g_list_reverse (copy);
}

185
static void
186
nautilus_view_identifier_free_callback (gpointer identifier, gpointer ignore)
187
{
Darin Adler's avatar
Darin Adler committed
188
	g_assert (ignore == NULL);
189 190 191 192
	nautilus_view_identifier_free (identifier);
}

void
193
nautilus_view_identifier_list_free (GList *list)
194
{
Darin Adler's avatar
Darin Adler committed
195
	nautilus_g_list_free_deep_custom
196
		(list, nautilus_view_identifier_free_callback, NULL);
197 198
}

199
int
200 201
nautilus_view_identifier_compare (const NautilusViewIdentifier *a,
				  const NautilusViewIdentifier *b)
202
{
203 204 205 206 207 208 209
	int result;

	result = strcmp (a->iid, b->iid);
	if (result != 0) {
		return result;
	}
	return strcmp (a->name, b->name);
210
}