xref: /haiku/src/tests/kits/storage/testapps/dump_mime_types.cpp (revision 31b14cbbf85a9a53eb8bf9d9b41f53351d0cbb8b)
1 // dump_mime_types.cpp
2 
3 #include <stdio.h>
4 #include <string.h>
5 #include <sys/utsname.h>
6 
7 #include <Application.h>
8 #include <Message.h>
9 #include <Mime.h>
10 
11 // main
12 int
main()13 main()
14 {
15 	// create a BApplication on BeOS
16 	struct utsname unameInfo;
17 	if (uname(&unameInfo) < 0 || strcmp(unameInfo.sysname, "Haiku") != 0)
18 		new BApplication("application/x-vnd.haiku.dump-mime-types");
19 
20 	// get the list of installed types
21 	BMessage installedTypes;
22 	status_t error = BMimeType::GetInstalledTypes(&installedTypes);
23 	if (error != B_OK) {
24 		fprintf(stderr, "Failed to get installed types: %s\n", strerror(error));
25 		exit(1);
26 	}
27 
28 	// print the types (including some additional info)
29 	const char *type;
30 	for (int i = 0; installedTypes.FindString("types", i, &type) == B_OK; i++) {
31 		printf("%s:\n", type);
32 
33 		// get mime type
34 		BMimeType mimeType;
35 		error = mimeType.SetTo(type);
36 		if (error != B_OK) {
37 			printf("  failed to init type: %s\n", strerror(error));
38 			continue;
39 		}
40 
41 		// preferred app
42 		char preferredApp[B_MIME_TYPE_LENGTH];
43 		if (mimeType.GetPreferredApp(preferredApp) == B_OK)
44 			printf("  preferred app:     %s\n", preferredApp);
45 
46 		// short description
47 		char shortDescription[256];
48 		if (mimeType.GetShortDescription(shortDescription) == B_OK)
49 			printf("  short description: %s\n", shortDescription);
50 
51 		// long description
52 		char longDescription[256];
53 		if (mimeType.GetLongDescription(longDescription) == B_OK)
54 			printf("  long description:  %s\n", longDescription);
55 
56 		// extensions
57 		BMessage extensions;
58 		if (mimeType.GetFileExtensions(&extensions) == B_OK) {
59 			printf("  extensions:        ");
60 			const char *extension;
61 			for (int k = 0;
62 				 extensions.FindString("extensions", k, &extension) == B_OK;
63 				 k++) {
64 				if (k > 0)
65 					printf(" ");
66 				printf("%s", extension);
67 			}
68 			printf("\n");
69 		}
70 
71 		// supporting apps
72 		BMessage supportingApps;
73 		if (mimeType.GetSupportingApps(&supportingApps) == B_OK) {
74 			const char *app;
75 			for (int k = 0;
76 				 supportingApps.FindString("applications", k, &app) == B_OK;
77 				 k++) {
78 				if (k == 0)
79 					printf("  supporting apps:   ");
80 				else
81 					printf("                     ");
82 				printf("%s\n", app);
83 			}
84 		}
85 
86 		// attr info
87 		BMessage attrInfo;
88 		if (mimeType.GetAttrInfo(&attrInfo) == B_OK) {
89 			printf("  attributes:\n");
90 			const char *name;
91 			const char *publicName;
92 			type_code type;
93 			bool isViewable;
94 			bool isPublic;
95 			bool isEditable;
96 			for (int k = 0;
97 				 attrInfo.FindString("attr:name", k, &name) == B_OK
98 				 && (attrInfo.FindString("attr:public_name", k,
99 				 	&publicName) == B_OK || (publicName = name, true))
100 				 && (attrInfo.FindInt32("attr:type", k, (int32*)&type) == B_OK
101 				 	|| (type = '____', true))
102 				 && (attrInfo.FindBool("attr:viewable", k, &isViewable) == B_OK
103 				 	|| (isViewable = false, true))
104 				 && (attrInfo.FindBool("attr:public", k, &isPublic) == B_OK
105 				 	|| (isPublic = isViewable, true))
106 				 && (attrInfo.FindBool("attr:editable", k, &isEditable) == B_OK
107 				 	|| (isEditable = false, true));
108 				 k++) {
109 				printf("    `%s' (`%s')\n", name, publicName);
110 				printf("      type:     %c%c%c%c (0x%lx)\n", char(type >> 24),
111 					char(type >> 16), char(type >> 8), char(type), type);
112 				printf("      public:   %s\n", (isPublic ? "true" : "false"));
113 				printf("      editable: %s\n", (isEditable ? "true" : "false"));
114 			}
115 		}
116 	}
117 
118 	return 0;
119 }
120