4
* Copyright 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
5
* Copyright 2012-2014 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
#include "fm-search.h"
33
char* content_pattern;
35
gboolean content_regex;
37
GList* search_path_list;
44
FmSearch* fm_search_new (void)
46
FmSearch* search = (FmSearch*)g_slice_new0(FmSearch);
50
void fm_search_free(FmSearch* search)
52
g_list_free_full(search->mime_types, (GDestroyNotify)g_free);
53
g_list_free_full(search->search_path_list, (GDestroyNotify)g_free);
54
g_free(search->name_patterns);
55
g_free(search->content_pattern);
56
g_free(search->max_mtime);
57
g_free(search->min_mtime);
58
g_slice_free(FmSearch, search);
61
gboolean fm_search_get_recursive(FmSearch* search)
63
return search->recursive;
66
void fm_search_set_recursive(FmSearch* search, gboolean recursive)
68
search->recursive = recursive;
71
gboolean fm_search_get_show_hidden(FmSearch* search)
73
return search->show_hidden;
76
void fm_search_set_show_hidden(FmSearch* search, gboolean show_hidden)
78
search->show_hidden = show_hidden;
81
const char* fm_search_get_name_patterns(FmSearch* search)
83
return search->name_patterns;
86
void fm_search_set_name_patterns(FmSearch* search, const char* name_patterns)
88
g_free(search->name_patterns);
89
search->name_patterns = g_strdup(name_patterns);
92
gboolean fm_search_get_name_ci(FmSearch* search)
94
return search->name_ci;
97
void fm_search_set_name_ci(FmSearch* search, gboolean name_ci)
99
search->name_ci = name_ci;
102
gboolean fm_search_get_name_regex(FmSearch* search)
104
return search->name_regex;
107
void fm_search_set_name_regex(FmSearch* search, gboolean name_regex)
109
search->name_regex = name_regex;
112
const char* fm_search_get_content_pattern(FmSearch* search)
114
return search->content_pattern;
117
void fm_search_set_content_pattern(FmSearch* search, const char* content_pattern)
119
g_free(search->content_pattern);
120
search->content_pattern = g_strdup(content_pattern);
123
gboolean fm_search_get_content_ci(FmSearch* search)
125
return search->content_ci;
128
void fm_search_set_content_ci(FmSearch* search, gboolean content_ci)
130
search->content_ci = content_ci;
133
gboolean fm_search_get_content_regex(FmSearch* search)
135
return search->content_regex;
138
void fm_search_set_content_regex(FmSearch* search, gboolean content_regex)
140
search->content_regex = content_regex;
143
void fm_search_add_dir(FmSearch* search, const char* dir)
145
GList* l = g_list_find_custom(search->search_path_list, dir, (GCompareFunc)strcmp);
147
search->search_path_list = g_list_prepend(search->search_path_list, g_strdup(dir));
150
void fm_search_remove_dir(FmSearch* search, const char* dir)
152
GList* l = g_list_find_custom(search->search_path_list, dir, (GCompareFunc)strcmp);
156
search->search_path_list = g_list_delete_link(search->search_path_list, l);
160
GList* fm_search_get_dirs(FmSearch* search)
162
return search->search_path_list;
165
void fm_search_add_mime_type(FmSearch* search, const char* mime_type)
167
GList* l = g_list_find_custom(search->mime_types, mime_type, (GCompareFunc)strcmp);
169
search->mime_types = g_list_prepend(search->mime_types, g_strdup(mime_type));
172
void fm_search_remove_mime_type(FmSearch* search, const char* mime_type)
174
GList* l = g_list_find_custom(search->mime_types, mime_type, (GCompareFunc)strcmp);
178
search->mime_types = g_list_delete_link(search->mime_types, l);
182
GList* fm_search_get_mime_types(FmSearch* search)
184
return search->mime_types;
187
guint64 fm_search_get_max_size(FmSearch* search)
189
return search->max_size;
192
void fm_search_set_max_size(FmSearch* search, guint64 size)
194
search->max_size = size;
197
guint64 fm_search_get_min_size(FmSearch* search)
199
return search->min_size;
202
void fm_search_set_min_size(FmSearch* search, guint64 size)
204
search->min_size = size;
207
/* format of mtime: YYYY-MM-DD */
208
const char* fm_search_get_max_mtime(FmSearch* search)
210
return search->max_mtime;
213
void fm_search_set_max_mtime(FmSearch* search, const char* mtime)
215
g_free(search->max_mtime);
216
search->max_mtime = g_strdup(mtime);
219
/* format of mtime: YYYY-MM-DD */
220
const char* fm_search_get_min_mtime(FmSearch* search)
222
return search->min_mtime;
225
void fm_search_set_min_mtime(FmSearch* search, const char* mtime)
227
g_free(search->min_mtime);
228
search->min_mtime = g_strdup(mtime);
231
/* really build the path */
232
FmPath* fm_search_dup_path(FmSearch* search)
234
FmPath* search_path = NULL;
235
GString* search_str = g_string_sized_new(1024);
236
/* build the search:// URI to perform the search */
237
g_string_append(search_str, "search://");
239
if(search->search_path_list) /* we need to have at least one dir path */
244
for(l = search->search_path_list; ; )
246
char *path_str = (char*)l->data;
247
/* escape possible '?' and ',' */
248
escaped = g_uri_escape_string(path_str, "!$&'()*+:;=/@", TRUE);
249
g_string_append(search_str, escaped);
253
if(!l) /* no more items */
255
g_string_append_c(search_str, ','); /* separator for paths */
258
g_string_append_c(search_str, '?');
259
g_string_append_printf(search_str, "recursive=%c", search->recursive ? '1' : '0');
260
g_string_append_printf(search_str, "&show_hidden=%c", search->show_hidden ? '1' : '0');
261
if(search->name_patterns && *search->name_patterns)
263
/* escape ampersands in pattern */
264
escaped = g_uri_escape_string(search->name_patterns, ":/?#[]@!$'()*+,;", TRUE);
265
if(search->name_regex)
266
g_string_append_printf(search_str, "&name_regex=%s", escaped);
268
g_string_append_printf(search_str, "&name=%s", escaped);
270
g_string_append_printf(search_str, "&name_ci=%c", search->name_ci ? '1' : '0');
274
if(search->content_pattern && *search->content_pattern)
276
/* escape ampersands in pattern */
277
escaped = g_uri_escape_string(search->content_pattern, ":/?#[]@!$'()*+,;^<>{}", TRUE);
278
if(search->content_regex)
279
g_string_append_printf(search_str, "&content_regex=%s", escaped);
281
g_string_append_printf(search_str, "&content=%s", escaped);
283
if(search->content_ci)
284
g_string_append_printf(search_str, "&content_ci=%c", search->content_ci ? '1' : '0');
287
/* search for the files of specific mime-types */
288
if(search->mime_types)
291
g_string_append(search_str, "&mime_types=");
292
for(l = search->mime_types; l; l=l->next)
294
const char* mime_type = (const char*)l->data;
295
g_string_append(search_str, mime_type);
297
g_string_append_c(search_str, ';');
302
g_string_append_printf(search_str, "&min_size=%llu", (unsigned long long)search->min_size);
305
g_string_append_printf(search_str, "&max_size=%llu", (unsigned long long)search->max_size);
307
if(search->min_mtime)
308
g_string_append_printf(search_str, "&min_mtime=%s", search->min_mtime);
310
if(search->max_mtime)
311
g_string_append_printf(search_str, "&max_mtime=%s", search->max_mtime);
313
search_path = fm_path_new_for_uri(search_str->str);
314
g_string_free(search_str, TRUE);