libxputty 0.1
Loading...
Searching...
No Matches
Data Structures | Typedefs | Enumerations | Functions | Variables
xdgmime.c File Reference

Go to the source code of this file.

Data Structures

struct  XdgDirTimeList
 
struct  XdgCallbackList
 

Typedefs

typedef struct XdgDirTimeList XdgDirTimeList
 
typedef struct XdgCallbackList XdgCallbackList
 
typedef int(* XdgDirectoryFunc) (const char *directory, void *user_data)
 

Enumerations

enum  { XDG_CHECKED_UNCHECKED , XDG_CHECKED_VALID , XDG_CHECKED_INVALID }
 

Functions

const char * xdg_mime_get_mime_type_for_data (const void *data, size_t len, int *result_prio)
 
const char * xdg_mime_get_mime_type_for_file (const char *file_name, struct stat *statbuf)
 
const char * xdg_mime_get_mime_type_from_file_name (const char *file_name)
 
int xdg_mime_get_mime_types_from_file_name (const char *file_name, const char *mime_types[], int n_mime_types)
 
int xdg_mime_is_valid_mime_type (const char *mime_type)
 
void xdg_mime_shutdown (void)
 
int xdg_mime_get_max_buffer_extents (void)
 
const char * _xdg_mime_unalias_mime_type (const char *mime_type)
 
const char * xdg_mime_unalias_mime_type (const char *mime_type)
 
int _xdg_mime_mime_type_equal (const char *mime_a, const char *mime_b)
 
int xdg_mime_mime_type_equal (const char *mime_a, const char *mime_b)
 
int xdg_mime_media_type_equal (const char *mime_a, const char *mime_b)
 
int _xdg_mime_mime_type_subclass (const char *mime, const char *base)
 
int xdg_mime_mime_type_subclass (const char *mime, const char *base)
 
char ** xdg_mime_list_mime_parents (const char *mime)
 
const char ** xdg_mime_get_mime_parents (const char *mime)
 
void xdg_mime_dump (void)
 
int xdg_mime_register_reload_callback (XdgMimeCallback callback, void *data, XdgMimeDestroy destroy)
 
void xdg_mime_remove_callback (int callback_id)
 
const char * xdg_mime_get_icon (const char *mime)
 
const char * xdg_mime_get_generic_icon (const char *mime)
 

Variables

XdgMimeCache ** _caches = NULL
 
const char xdg_mime_type_unknown [] = "application/octet-stream"
 
const char xdg_mime_type_empty [] = "application/x-zerosize"
 
const char xdg_mime_type_textplain [] = "text/plain"
 

Typedef Documentation

◆ XdgCallbackList

Definition at line 49 of file xdgmime.c.

◆ XdgDirectoryFunc

typedef int(* XdgDirectoryFunc) (const char *directory, void *user_data)

Definition at line 98 of file xdgmime.c.

◆ XdgDirTimeList

Definition at line 48 of file xdgmime.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
XDG_CHECKED_UNCHECKED 
XDG_CHECKED_VALID 
XDG_CHECKED_INVALID 

Definition at line 71 of file xdgmime.c.

72{
76};
@ XDG_CHECKED_VALID
Definition xdgmime.c:74
@ XDG_CHECKED_INVALID
Definition xdgmime.c:75
@ XDG_CHECKED_UNCHECKED
Definition xdgmime.c:73

Function Documentation

◆ _xdg_mime_mime_type_equal()

int _xdg_mime_mime_type_equal ( const char *  mime_a,
const char *  mime_b 
)

Definition at line 706 of file xdgmime.c.

708{
709 const char *unalias_a, *unalias_b;
710
711 unalias_a = _xdg_mime_unalias_mime_type (mime_a);
712 unalias_b = _xdg_mime_unalias_mime_type (mime_b);
713
714 if (strcmp (unalias_a, unalias_b) == 0)
715 return 1;
716
717 return 0;
718}
const char * _xdg_mime_unalias_mime_type(const char *mime_type)
Definition xdgmime.c:684

References _xdg_mime_unalias_mime_type().

Referenced by _xdg_mime_magic_lookup_data(), and xdg_mime_mime_type_equal().

◆ _xdg_mime_mime_type_subclass()

int _xdg_mime_mime_type_subclass ( const char *  mime,
const char *  base 
)

Definition at line 770 of file xdgmime.c.

772{
773 const char *umime, *ubase;
774 const char **parents;
775
776 if (_caches)
777 return _xdg_mime_cache_mime_type_subclass (mime, base);
778
779 umime = _xdg_mime_unalias_mime_type (mime);
780 ubase = _xdg_mime_unalias_mime_type (base);
781
782 if (strcmp (umime, ubase) == 0)
783 return 1;
784
785#if 1
786 /* Handle supertypes */
787 if (xdg_mime_is_super_type (ubase) &&
788 xdg_mime_media_type_equal (umime, ubase))
789 return 1;
790#endif
791
792 /* Handle special cases text/plain and application/octet-stream */
793 if (strcmp (ubase, "text/plain") == 0 &&
794 strncmp (umime, "text/", 5) == 0)
795 return 1;
796
797 if (strcmp (ubase, "application/octet-stream") == 0 &&
798 strncmp (umime, "inode/", 6) != 0)
799 return 1;
800
801 parents = _xdg_mime_parent_list_lookup (parent_list, umime);
802 for (; parents && *parents; parents++)
803 {
804 if (_xdg_mime_mime_type_subclass (*parents, ubase))
805 return 1;
806 }
807
808 return 0;
809}
int xdg_mime_media_type_equal(const char *mime_a, const char *mime_b)
Definition xdgmime.c:730
int _xdg_mime_mime_type_subclass(const char *mime, const char *base)
Definition xdgmime.c:770
XdgMimeCache ** _caches
Definition xdgmime.c:63
int _xdg_mime_cache_mime_type_subclass(const char *mime, const char *base)
const char ** _xdg_mime_parent_list_lookup(XdgParentList *list, const char *mime)

References _caches, _xdg_mime_cache_mime_type_subclass(), _xdg_mime_mime_type_subclass(), _xdg_mime_parent_list_lookup(), _xdg_mime_unalias_mime_type(), and xdg_mime_media_type_equal().

Referenced by _xdg_mime_mime_type_subclass(), and xdg_mime_mime_type_subclass().

◆ _xdg_mime_unalias_mime_type()

const char * _xdg_mime_unalias_mime_type ( const char *  mime_type)

Definition at line 684 of file xdgmime.c.

685{
686 const char *lookup;
687
688 if (_caches)
689 return _xdg_mime_cache_unalias_mime_type (mime_type);
690
691 if ((lookup = _xdg_mime_alias_list_lookup (alias_list, mime_type)) != NULL)
692 return lookup;
693
694 return mime_type;
695}
const char * _xdg_mime_alias_list_lookup(XdgAliasList *list, const char *alias)
const char * _xdg_mime_cache_unalias_mime_type(const char *mime)

References _caches, _xdg_mime_alias_list_lookup(), and _xdg_mime_cache_unalias_mime_type().

Referenced by _xdg_mime_mime_type_equal(), _xdg_mime_mime_type_subclass(), xdg_mime_get_mime_parents(), and xdg_mime_unalias_mime_type().

◆ xdg_mime_dump()

void xdg_mime_dump ( void  )

Definition at line 857 of file xdgmime.c.

858{
859 xdg_mime_init();
860
861 printf ("*** ALIASES ***\n\n");
862 _xdg_mime_alias_list_dump (alias_list);
863 printf ("\n*** PARENTS ***\n\n");
864 _xdg_mime_parent_list_dump (parent_list);
865 printf ("\n*** CACHE ***\n\n");
866 _xdg_glob_hash_dump (global_hash);
867 printf ("\n*** GLOBS ***\n\n");
868 _xdg_glob_hash_dump (global_hash);
869 printf ("\n*** GLOBS REVERSE TREE ***\n\n");
871}
void _xdg_mime_alias_list_dump(XdgAliasList *list)
void _xdg_mime_cache_glob_dump(void)
void _xdg_glob_hash_dump(XdgGlobHash *glob_hash)
void _xdg_mime_parent_list_dump(XdgParentList *list)

References _xdg_glob_hash_dump(), _xdg_mime_alias_list_dump(), _xdg_mime_cache_glob_dump(), and _xdg_mime_parent_list_dump().

◆ xdg_mime_get_generic_icon()

const char * xdg_mime_get_generic_icon ( const char *  mime)

Definition at line 937 of file xdgmime.c.

938{
939 xdg_mime_init ();
940
941 if (_caches)
943
944 return _xdg_mime_icon_list_lookup (generic_icon_list, mime);
945}
const char * _xdg_mime_cache_get_generic_icon(const char *mime)
const char * _xdg_mime_icon_list_lookup(XdgIconList *list, const char *mime_type)
Definition xdgmimeicon.c:98

References _caches, _xdg_mime_cache_get_generic_icon(), and _xdg_mime_icon_list_lookup().

◆ xdg_mime_get_icon()

const char * xdg_mime_get_icon ( const char *  mime)

Definition at line 926 of file xdgmime.c.

927{
928 xdg_mime_init ();
929
930 if (_caches)
931 return _xdg_mime_cache_get_icon (mime);
932
933 return _xdg_mime_icon_list_lookup (icon_list, mime);
934}
const char * _xdg_mime_cache_get_icon(const char *mime)

References _caches, _xdg_mime_cache_get_icon(), and _xdg_mime_icon_list_lookup().

◆ xdg_mime_get_max_buffer_extents()

int xdg_mime_get_max_buffer_extents ( void  )

Definition at line 673 of file xdgmime.c.

674{
675 xdg_mime_init ();
676
677 if (_caches)
679
680 return _xdg_mime_magic_get_buffer_extents (global_magic);
681}
int _xdg_mime_cache_get_max_buffer_extents(void)
int _xdg_mime_magic_get_buffer_extents(XdgMimeMagic *mime_magic)

References _caches, _xdg_mime_cache_get_max_buffer_extents(), and _xdg_mime_magic_get_buffer_extents().

◆ xdg_mime_get_mime_parents()

const char ** xdg_mime_get_mime_parents ( const char *  mime)

Definition at line 845 of file xdgmime.c.

846{
847 const char *umime;
848
849 xdg_mime_init ();
850
851 umime = _xdg_mime_unalias_mime_type (mime);
852
853 return _xdg_mime_parent_list_lookup (parent_list, umime);
854}

References _xdg_mime_parent_list_lookup(), and _xdg_mime_unalias_mime_type().

Referenced by xdg_mime_list_mime_parents().

◆ xdg_mime_get_mime_type_for_data()

const char * xdg_mime_get_mime_type_for_data ( const void *  data,
size_t  len,
int *  result_prio 
)

Definition at line 466 of file xdgmime.c.

469{
470 const char *mime_type;
471
472 if (len == 0)
473 {
474 if (result_prio != NULL)
475 *result_prio = 100;
476 return XDG_MIME_TYPE_EMPTY;
477 }
478
479 xdg_mime_init ();
480
481 if (_caches)
482 mime_type = _xdg_mime_cache_get_mime_type_for_data (data, len, result_prio);
483 else
484 mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, result_prio, NULL, 0);
485
486 if (mime_type)
487 return mime_type;
488
489 return _xdg_binary_or_text_fallback(data, len);
490}
const char * _xdg_mime_cache_get_mime_type_for_data(const void *data, size_t len, int *result_prio)
const char * _xdg_binary_or_text_fallback(const void *data, size_t len)
Definition xdgmimeint.c:193
const char * _xdg_mime_magic_lookup_data(XdgMimeMagic *mime_magic, const void *data, size_t len, int *result_prio, const char *mime_types[], int n_mime_types)

References _caches, _xdg_binary_or_text_fallback(), _xdg_mime_cache_get_mime_type_for_data(), and _xdg_mime_magic_lookup_data().

◆ xdg_mime_get_mime_type_for_file()

const char * xdg_mime_get_mime_type_for_file ( const char *  file_name,
struct stat *  statbuf 
)

Definition at line 493 of file xdgmime.c.

495{
496 const char *mime_type;
497 /* currently, only a few globs occur twice, and none
498 * more often, so 5 seems plenty.
499 */
500 const char *mime_types[5];
501 FILE *file;
502 unsigned char *data;
503 int max_extent;
504 int bytes_read;
505 struct stat buf;
506 const char *base_name;
507 int n;
508
509 if (file_name == NULL)
510 return NULL;
511 if (! _xdg_utf8_validate (file_name))
512 return NULL;
513
514 xdg_mime_init ();
515
516 if (_caches)
517 return _xdg_mime_cache_get_mime_type_for_file (file_name, statbuf);
518
519 base_name = _xdg_get_base_name (file_name);
520 n = _xdg_glob_hash_lookup_file_name (global_hash, base_name, mime_types, 5);
521
522 if (n == 1)
523 return mime_types[0];
524
525 if (!statbuf)
526 {
527 if (stat (file_name, &buf) != 0)
528 return XDG_MIME_TYPE_UNKNOWN;
529
530 statbuf = &buf;
531 }
532
533 if (!S_ISREG (statbuf->st_mode))
534 return XDG_MIME_TYPE_UNKNOWN;
535
536 /* FIXME: Need to make sure that max_extent isn't totally broken. This could
537 * be large and need getting from a stream instead of just reading it all
538 * in. */
539 max_extent = _xdg_mime_magic_get_buffer_extents (global_magic);
540 data = malloc (max_extent);
541 if (data == NULL)
542 return XDG_MIME_TYPE_UNKNOWN;
543
544 file = fopen (file_name, "r");
545 if (file == NULL)
546 {
547 free (data);
548 return XDG_MIME_TYPE_UNKNOWN;
549 }
550
551 bytes_read = fread (data, 1, max_extent, file);
552 if (ferror (file))
553 {
554 free (data);
555 fclose (file);
556 return XDG_MIME_TYPE_UNKNOWN;
557 }
558
559 mime_type = _xdg_mime_magic_lookup_data (global_magic, data, bytes_read, NULL,
560 mime_types, n);
561
562 if (!mime_type)
563 mime_type = _xdg_binary_or_text_fallback (data, bytes_read);
564
565 free (data);
566 fclose (file);
567
568 return mime_type;
569}
const char * _xdg_mime_cache_get_mime_type_for_file(const char *file_name, struct stat *statbuf)
int _xdg_glob_hash_lookup_file_name(XdgGlobHash *glob_hash, const char *file_name, const char *mime_types[], int n_mime_types)
const char * _xdg_get_base_name(const char *file_name)
Definition xdgmimeint.c:141
int _xdg_utf8_validate(const char *source)
Definition xdgmimeint.c:134

References _caches, _xdg_binary_or_text_fallback(), _xdg_get_base_name(), _xdg_glob_hash_lookup_file_name(), _xdg_mime_cache_get_mime_type_for_file(), _xdg_mime_magic_get_buffer_extents(), _xdg_mime_magic_lookup_data(), and _xdg_utf8_validate().

◆ xdg_mime_get_mime_type_from_file_name()

const char * xdg_mime_get_mime_type_from_file_name ( const char *  file_name)

Definition at line 572 of file xdgmime.c.

573{
574 const char *mime_type;
575
576 xdg_mime_init ();
577
578 if (_caches)
580
581 if (_xdg_glob_hash_lookup_file_name (global_hash, file_name, &mime_type, 1))
582 return mime_type;
583 else
584 return XDG_MIME_TYPE_UNKNOWN;
585}
const char * _xdg_mime_cache_get_mime_type_from_file_name(const char *file_name)

References _caches, _xdg_glob_hash_lookup_file_name(), and _xdg_mime_cache_get_mime_type_from_file_name().

◆ xdg_mime_get_mime_types_from_file_name()

int xdg_mime_get_mime_types_from_file_name ( const char *  file_name,
const char *  mime_types[],
int  n_mime_types 
)

Definition at line 588 of file xdgmime.c.

591{
592 xdg_mime_init ();
593
594 if (_caches)
595 return _xdg_mime_cache_get_mime_types_from_file_name (file_name, mime_types, n_mime_types);
596
597 return _xdg_glob_hash_lookup_file_name (global_hash, file_name, mime_types, n_mime_types);
598}
int _xdg_mime_cache_get_mime_types_from_file_name(const char *file_name, const char *mime_types[], int n_mime_types)

References _caches, _xdg_glob_hash_lookup_file_name(), and _xdg_mime_cache_get_mime_types_from_file_name().

◆ xdg_mime_is_valid_mime_type()

int xdg_mime_is_valid_mime_type ( const char *  mime_type)

Definition at line 601 of file xdgmime.c.

602{
603 /* FIXME: We should make this a better test
604 */
605 return _xdg_utf8_validate (mime_type);
606}

References _xdg_utf8_validate().

◆ xdg_mime_list_mime_parents()

char ** xdg_mime_list_mime_parents ( const char *  mime)

Definition at line 821 of file xdgmime.c.

822{
823 const char **parents;
824 char **result;
825 int i, n;
826
827 if (_caches)
829
830 parents = xdg_mime_get_mime_parents (mime);
831
832 if (!parents)
833 return NULL;
834
835 for (i = 0; parents[i]; i++) ;
836
837 n = (i + 1) * sizeof (char *);
838 result = (char **) malloc (n);
839 memcpy (result, parents, n);
840
841 return result;
842}
const char ** xdg_mime_get_mime_parents(const char *mime)
Definition xdgmime.c:845
char ** _xdg_mime_cache_list_mime_parents(const char *mime)

References _caches, _xdg_mime_cache_list_mime_parents(), and xdg_mime_get_mime_parents().

◆ xdg_mime_media_type_equal()

int xdg_mime_media_type_equal ( const char *  mime_a,
const char *  mime_b 
)

Definition at line 730 of file xdgmime.c.

732{
733 char *sep;
734
735 sep = strchr (mime_a, '/');
736
737 if (sep && strncmp (mime_a, mime_b, sep - mime_a + 1) == 0)
738 return 1;
739
740 return 0;
741}

Referenced by _xdg_mime_cache_mime_type_subclass(), and _xdg_mime_mime_type_subclass().

◆ xdg_mime_mime_type_equal()

int xdg_mime_mime_type_equal ( const char *  mime_a,
const char *  mime_b 
)

Definition at line 721 of file xdgmime.c.

723{
724 xdg_mime_init ();
725
726 return _xdg_mime_mime_type_equal (mime_a, mime_b);
727}
int _xdg_mime_mime_type_equal(const char *mime_a, const char *mime_b)
Definition xdgmime.c:706

References _xdg_mime_mime_type_equal().

◆ xdg_mime_mime_type_subclass()

int xdg_mime_mime_type_subclass ( const char *  mime,
const char *  base 
)

Definition at line 812 of file xdgmime.c.

814{
815 xdg_mime_init ();
816
817 return _xdg_mime_mime_type_subclass (mime, base);
818}

References _xdg_mime_mime_type_subclass().

◆ xdg_mime_register_reload_callback()

int xdg_mime_register_reload_callback ( XdgMimeCallback  callback,
void *  data,
XdgMimeDestroy  destroy 
)

Definition at line 877 of file xdgmime.c.

880{
881 XdgCallbackList *list_el;
882 static int callback_id = 1;
883
884 /* Make a new list element */
885 list_el = calloc (1, sizeof (XdgCallbackList));
886 list_el->callback_id = callback_id;
887 list_el->callback = callback;
888 list_el->data = data;
889 list_el->destroy = destroy;
890 list_el->next = callback_list;
891 if (list_el->next)
892 list_el->next->prev = list_el;
893
894 callback_list = list_el;
895 callback_id ++;
896
897 return callback_id - 1;
898}
XdgCallbackList * prev
Definition xdgmime.c:89
XdgCallbackList * next
Definition xdgmime.c:88
XdgMimeDestroy destroy
Definition xdgmime.c:93
void * data
Definition xdgmime.c:92
XdgMimeCallback callback
Definition xdgmime.c:91

References XdgCallbackList::callback, XdgCallbackList::callback_id, XdgCallbackList::data, XdgCallbackList::destroy, XdgCallbackList::next, and XdgCallbackList::prev.

◆ xdg_mime_remove_callback()

void xdg_mime_remove_callback ( int  callback_id)

Definition at line 901 of file xdgmime.c.

902{
903 XdgCallbackList *list;
904
905 for (list = callback_list; list; list = list->next)
906 {
907 if (list->callback_id == callback_id)
908 {
909 if (list->next)
910 list->next = list->prev;
911
912 if (list->prev)
913 list->prev->next = list->next;
914 else
915 callback_list = list->next;
916
917 /* invoke the destroy handler */
918 (list->destroy) (list->data);
919 free (list);
920 return;
921 }
922 }
923}

References XdgCallbackList::callback_id, XdgCallbackList::data, XdgCallbackList::destroy, XdgCallbackList::next, and XdgCallbackList::prev.

◆ xdg_mime_shutdown()

void xdg_mime_shutdown ( void  )

Definition at line 609 of file xdgmime.c.

610{
611 XdgCallbackList *list;
612
613 /* FIXME: Need to make this (and the whole library) thread safe */
614 if (dir_time_list)
615 {
616 xdg_dir_time_list_free (dir_time_list);
617 dir_time_list = NULL;
618 }
619
620 if (global_hash)
621 {
622 _xdg_glob_hash_free (global_hash);
623 global_hash = NULL;
624 }
625 if (global_magic)
626 {
627 _xdg_mime_magic_free (global_magic);
628 global_magic = NULL;
629 }
630
631 if (alias_list)
632 {
633 _xdg_mime_alias_list_free (alias_list);
634 alias_list = NULL;
635 }
636
637 if (parent_list)
638 {
639 _xdg_mime_parent_list_free (parent_list);
640 parent_list = NULL;
641 }
642
643 if (icon_list)
644 {
645 _xdg_mime_icon_list_free (icon_list);
646 icon_list = NULL;
647 }
648
649 if (generic_icon_list)
650 {
651 _xdg_mime_icon_list_free (generic_icon_list);
652 generic_icon_list = NULL;
653 }
654
655 if (_caches)
656 {
657 int i;
658
659 for (i = 0; i < n_caches; i++)
661 free (_caches);
662 _caches = NULL;
663 n_caches = 0;
664 }
665
666 for (list = callback_list; list; list = list->next)
667 (list->callback) (list->data);
668
669 need_reread = TRUE;
670}
void _xdg_mime_alias_list_free(XdgAliasList *list)
void _xdg_mime_cache_unref(XdgMimeCache *cache)
void _xdg_glob_hash_free(XdgGlobHash *glob_hash)
void _xdg_mime_icon_list_free(XdgIconList *list)
Definition xdgmimeicon.c:75
void _xdg_mime_magic_free(XdgMimeMagic *mime_magic)
void _xdg_mime_parent_list_free(XdgParentList *list)

References _caches, _xdg_glob_hash_free(), _xdg_mime_alias_list_free(), _xdg_mime_cache_unref(), _xdg_mime_icon_list_free(), _xdg_mime_magic_free(), _xdg_mime_parent_list_free(), XdgCallbackList::callback, XdgCallbackList::data, and XdgCallbackList::next.

◆ xdg_mime_unalias_mime_type()

const char * xdg_mime_unalias_mime_type ( const char *  mime_type)

Definition at line 698 of file xdgmime.c.

699{
700 xdg_mime_init ();
701
702 return _xdg_mime_unalias_mime_type (mime_type);
703}

References _xdg_mime_unalias_mime_type().

Referenced by _xdg_mime_cache_list_mime_parents().

Variable Documentation

◆ _caches

XdgMimeCache** _caches = NULL

◆ xdg_mime_type_empty

const char xdg_mime_type_empty[] = "application/x-zerosize"

Definition at line 67 of file xdgmime.c.

◆ xdg_mime_type_textplain

const char xdg_mime_type_textplain[] = "text/plain"

Definition at line 68 of file xdgmime.c.

◆ xdg_mime_type_unknown

const char xdg_mime_type_unknown[] = "application/octet-stream"

Definition at line 66 of file xdgmime.c.