270 const char *type,
const char *uuid,
271 const char *creation_iso_time,
272 const char *modification_iso_time,
const char *name,
273 const char *format_name)
276 struct tm now_broken;
277 gchar *now_date_str, *creation_date_str, *modification_date_str;
278 gchar *now_time_str, *creation_time_str, *modification_time_str;
279 struct tm creation_time, modification_time;
280 gchar *creation_date_short, *modification_date_short;
282 GString *file_name_buf;
283 int format_state = 0;
286 creation_date_str = NULL;
287 modification_date_str = NULL;
288 creation_time_str = NULL;
289 modification_time_str = NULL;
292 if (localtime_r (&now, &now_broken) == NULL)
294 g_warning (
"%s: localtime failed", __func__);
296 now_date_str = g_strdup_printf (
"%04d%02d%02d", (now_broken.tm_year + 1900),
297 (now_broken.tm_mon + 1), now_broken.tm_mday);
298 now_time_str = g_strdup_printf (
"%02d%02d%02d", now_broken.tm_hour,
299 now_broken.tm_min, now_broken.tm_sec);
301 memset (&creation_time, 0,
sizeof (
struct tm));
302 memset (&modification_time, 0,
sizeof (
struct tm));
303 creation_date_short = NULL;
304 modification_date_short = NULL;
306 if (creation_iso_time && (strlen (creation_iso_time) >= 19))
307 creation_date_short = g_strndup (creation_iso_time, 19);
309 if (creation_date_short
310 && (((ret = strptime (creation_date_short,
"%Y-%m-%dT%H:%M:%S",
313 || (strlen (ret) == 0)))
316 g_strdup_printf (
"%04d%02d%02d", (creation_time.tm_year + 1900),
317 (creation_time.tm_mon + 1), creation_time.tm_mday);
319 g_strdup_printf (
"%02d%02d%02d", creation_time.tm_hour,
320 creation_time.tm_min, creation_time.tm_sec);
322 g_free (creation_date_short);
324 if (modification_iso_time && (strlen (modification_iso_time) >= 19))
325 modification_date_short = g_strndup (modification_iso_time, 19);
327 if (modification_date_short
328 && (((ret = strptime (modification_date_short,
"%Y-%m-%dT%H:%M:%S",
331 || (strlen (ret) == 0)))
333 modification_date_str = g_strdup_printf (
334 "%04d%02d%02d", (modification_time.tm_year + 1900),
335 (modification_time.tm_mon + 1), modification_time.tm_mday);
337 modification_time_str =
338 g_strdup_printf (
"%02d%02d%02d", modification_time.tm_hour,
339 modification_time.tm_min, modification_time.tm_sec);
341 g_free (modification_date_short);
343 if (creation_date_str == NULL)
344 creation_date_str = g_strdup (now_date_str);
345 if (modification_date_str == NULL)
346 modification_date_str = g_strdup (creation_date_str);
347 if (creation_time_str == NULL)
348 creation_time_str = g_strdup (now_time_str);
349 if (modification_time_str == NULL)
350 modification_time_str = g_strdup (creation_time_str);
352 file_name_buf = g_string_new (
"");
354 fname_point = (
char *) fname_format;
356 while (format_state >= 0 && *fname_point !=
'\0')
358 if (format_state == 0)
360 if (*fname_point ==
'%')
362 else if (*fname_point ==
'"')
363 g_string_append (file_name_buf,
"\\\"");
364 else if (*fname_point <=
' ')
365 g_string_append_c (file_name_buf,
'_');
367 g_string_append_c (file_name_buf, *fname_point);
369 else if (format_state == 1)
372 switch (*fname_point)
375 g_string_append (file_name_buf, creation_date_str);
378 g_string_append (file_name_buf, creation_time_str);
381 g_string_append_printf (file_name_buf,
"%02d",
382 modification_time.tm_mday);
385 g_string_append (file_name_buf, now_date_str);
388 g_string_append (file_name_buf,
389 format_name ? format_name :
"XML");
392 g_string_append (file_name_buf, modification_date_str);
395 g_string_append (file_name_buf, modification_time_str);
398 g_string_append (file_name_buf,
399 name ? name : (type ? type :
"unnamed"));
402 g_string_append_printf (file_name_buf,
"%02d",
403 modification_time.tm_mon + 1);
406 g_string_append (file_name_buf, type ? type :
"resource");
409 g_string_append (file_name_buf, now_time_str);
412 g_string_append (file_name_buf, uuid ? uuid :
"list");
415 g_string_append (file_name_buf, username ? username :
"");
418 g_string_append_printf (file_name_buf,
"%04d",
419 modification_time.tm_year + 1900);
422 g_string_append_c (file_name_buf,
'%');
425 g_warning (
"%s : Unknown file name format placeholder: %%%c.",
426 __func__, *fname_point);
430 fname_point +=
sizeof (char);
433 if (format_state || strcmp (file_name_buf->str,
"") == 0)
435 g_warning (
"%s : Invalid file name format", __func__);
436 g_string_free (file_name_buf, TRUE);
440 fname_point = file_name_buf->str;
441 while (*fname_point !=
'\0')
443 if (*fname_point <=
' ')
448 g_free (now_date_str);
449 g_free (now_time_str);
450 g_free (creation_date_str);
451 g_free (creation_time_str);
452 g_free (modification_date_str);
453 g_free (modification_time_str);
454 return g_string_free (file_name_buf, FALSE);