gio-du: show the correct filename in progress
[platform/upstream/glib.git] / gio / tests / gio-du.c
1 #include <gio/gio.h>
2 #include <locale.h>
3
4 static gboolean option_use_async;
5 static gint     option_format_size;
6
7 static gint     outstanding_asyncs;
8
9 #ifdef G_OS_WIN32
10 typedef struct {
11   int newmode;
12 } _startupinfo;
13
14 #ifndef _MSC_VER
15
16 extern void __wgetmainargs(int *argc,
17                            wchar_t ***wargv,
18                            wchar_t ***wenviron,
19                            int expand_wildcards,
20                            _startupinfo *startupinfo);
21 #endif
22 #endif
23
24 static void
25 print_result (const gchar *filename,
26               guint64      disk_usage,
27               guint64      num_dirs,
28               guint64      num_files,
29               GError      *error,
30               gchar        nl)
31 {
32   if (!error)
33     {
34       if (option_format_size)
35         {
36           GFormatSizeFlags format_flags;
37           gchar *str;
38
39           format_flags = (option_format_size > 1) ? G_FORMAT_SIZE_LONG_FORMAT : G_FORMAT_SIZE_DEFAULT;
40           str = g_format_size_full (disk_usage, format_flags);
41           g_print ("%s: %s (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
42                    filename, str, num_dirs, num_files, nl);
43           g_free (str);
44         }
45       else
46         g_print ("%s: %"G_GUINT64_FORMAT" (%"G_GUINT64_FORMAT" dirs, %"G_GUINT64_FORMAT" files)%c",
47                  filename, disk_usage, num_dirs, num_files, nl);
48     }
49   else
50     {
51       g_printerr ("%s: %s\n", filename, error->message);
52       g_error_free (error);
53     }
54 }
55
56 static void
57 async_ready_func (GObject      *source,
58                   GAsyncResult *result,
59                   gpointer      user_data)
60 {
61   const gchar *filename = user_data;
62   GError *error = NULL;
63   guint64 disk_usage;
64   guint64 num_dirs;
65   guint64 num_files;
66
67   g_file_measure_disk_usage_finish (G_FILE (source), result, &disk_usage, &num_dirs, &num_files, &error);
68   print_result (filename, disk_usage, num_dirs, num_files, error, '\n');
69   outstanding_asyncs--;
70 }
71
72 static void
73 report_progress (gboolean reporting,
74                  guint64  disk_usage,
75                  guint64  num_dirs,
76                  guint64  num_files,
77                  gpointer user_data)
78 {
79   const gchar *filename = user_data;
80
81   if (!reporting)
82     g_printerr ("%s: warning: does not support progress reporting\n", filename);
83
84   print_result (filename, disk_usage, num_dirs, num_files, NULL, '\r');
85 }
86
87 int
88 main (int argc, char **argv)
89 {
90   GFileMeasureProgressCallback progress = NULL;
91   GFileMeasureFlags flags = 0;
92   gint i;
93 #ifdef G_OS_WIN32
94   int wargc;
95   wchar_t **wargv, **wenvp;
96   _startupinfo si = { 0 };
97
98   __wgetmainargs (&wargc, &wargv, &wenvp, 0, &si);
99 #endif
100
101   setlocale (LC_ALL, "");
102
103
104
105   for (i = 1; argv[i] && argv[i][0] == '-'; i++)
106     {
107       if (g_str_equal (argv[i], "--"))
108         break;
109
110       if (g_str_equal (argv[i], "--help"))
111         {
112           g_print ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
113           return 0;
114         }
115       else if (g_str_equal (argv[i], "-x"))
116         flags |= G_FILE_MEASURE_NO_XDEV;
117       else if (g_str_equal (argv[i], "-h"))
118         option_format_size++;
119       else if (g_str_equal (argv[i], "--apparent-size"))
120         flags |= G_FILE_MEASURE_APPARENT_SIZE;
121       else if (g_str_equal (argv[i], "--any-error"))
122         flags |= G_FILE_MEASURE_REPORT_ANY_ERROR;
123       else if (g_str_equal (argv[i], "--async"))
124         option_use_async = TRUE;
125       else if (g_str_equal (argv[i], "--progress"))
126         progress = report_progress;
127       else
128         {
129           g_printerr ("unrecognised flag %s\n", argv[i]);
130         }
131     }
132
133   if (!argv[i])
134     {
135       g_printerr ("usage: du [--progress] [--async] [-x] [-h] [-h] [--apparent-size] [--any-error] [--] files...\n");
136       return 1;
137     }
138
139 #ifdef G_OS_WIN32
140   while (wargv[i])
141   {
142     gchar *argv_utf8 = g_utf16_to_utf8 (wargv[i], -1, NULL, NULL, NULL);
143 #else
144   while (argv[i])
145   {
146     gchar *argv_utf8 = argv[i];
147 #endif
148     GFile *file = g_file_new_for_commandline_arg (argv_utf8);
149
150     if (option_use_async)
151     {
152       g_file_measure_disk_usage_async (file, flags, G_PRIORITY_DEFAULT, NULL,
153                                        progress, argv_utf8, async_ready_func, argv_utf8);
154       outstanding_asyncs++;
155     }
156     else
157     {
158       GError *error = NULL;
159       guint64 disk_usage;
160       guint64 num_dirs;
161       guint64 num_files;
162
163       g_file_measure_disk_usage (file, flags, NULL, progress, argv_utf8,
164                                  &disk_usage, &num_dirs, &num_files, &error);
165       print_result (argv_utf8, disk_usage, num_dirs, num_files, error, '\n');
166     }
167
168     g_object_unref (file);
169 #ifdef G_OS_WIN32
170     g_free (argv_utf8);
171 #endif
172
173     i++;
174   }
175
176   while (outstanding_asyncs)
177     g_main_context_iteration (NULL, TRUE);
178
179   return 0;
180 }