|
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <getopt.h>
-
- #include <jack/jack.h>
- #include <jack/metadata.h>
- #include <jack/uuid.h>
- #include <jack/session.h>
-
- static int subject_is_client = 0;
- static int subject_is_port = 0;
- static jack_uuid_t uuid;
- static char* subject;
-
- static void
- show_usage (void)
- {
- fprintf (stderr, "\nUsage: jack_property [options] UUID [ key [ value [ type ] ] ]\n");
- fprintf (stderr, "Set/Display JACK properties (metadata).\n\n");
- fprintf (stderr, "Set options:\n");
- fprintf (stderr, " -s, --set Set property \"key\" to \"value\" for \"UUID\" with optional MIME type \"type\"\n");
- fprintf (stderr, " -d, --delete Remove/delete property \"key\" for \"UUID\"\n");
- fprintf (stderr, " -d, --delete UUID Remove/delete all properties for \"UUID\"\n");
- fprintf (stderr, " -D, --delete-all Remove/delete all properties\n");
- fprintf (stderr, " --client Interpret UUID as a client name, not a UUID\n");
- fprintf (stderr, " --port \tInterpret UUID as a port name, not a UUID\n");
- fprintf (stderr, "\nDisplay options:\n");
- fprintf (stderr, " -l Show all properties\n");
- fprintf (stderr, " -l, --list UUID \tShow value all properties of UUID\n");
- fprintf (stderr, " -l, --list UUID key Show value for key of UUID\n");
- fprintf (stderr, "\nFor more information see http://jackaudio.org/\n");
- }
-
- static int
- get_subject (jack_client_t* client, char* argv[], int* optind)
- {
- if (subject_is_client) {
- char* cstr = argv[(*optind)++];
- char* ustr;
-
- if ((ustr = jack_get_uuid_for_client_name (client, cstr)) == NULL) {
- fprintf (stderr, "cannot get UUID for client named %s\n", cstr);
- return -1;
- }
-
- if (jack_uuid_parse (ustr, &uuid)) {
- fprintf (stderr, "cannot parse client UUID as UUID\n");
- return -1;
- }
-
- subject = cstr;
-
- } else if (subject_is_port) {
-
- char* pstr = argv[(*optind)++];
- jack_port_t* port;
-
- if ((port = jack_port_by_name (client, pstr)) == NULL) {
- fprintf (stderr, "cannot find port name %s\n", pstr);
- return -1;
- }
-
- uuid = jack_port_uuid (port);
- subject = pstr;
-
- } else {
- char* str = argv[(*optind)++];
-
- if (jack_uuid_parse (str, &uuid)) {
- fprintf (stderr, "cannot parse subject as UUID\n");
- return -1;
- }
-
- subject = str;
- }
-
- return 0;
- }
-
- int main (int argc, char* argv[])
- {
- jack_client_t* client = NULL;
- jack_options_t options = JackNoStartServer;
- char* key = NULL;
- char* value = NULL;
- char* type = NULL;
- int set = 1;
- int delete = 0;
- int delete_all = 0;
- int c;
- int option_index;
- extern int optind;
- struct option long_options[] = {
- { "set", 0, 0, 's' },
- { "delete", 0, 0, 'd' },
- { "delete-all", 0, 0, 'D' },
- { "list", 0, 0, 'l' },
- { "client", 0, 0, 'c' },
- { "port", 0, 0, 'p' },
- { 0, 0, 0, 0 }
- };
-
- if (argc < 2) {
- show_usage ();
- exit (1);
- }
-
- while ((c = getopt_long (argc, argv, "sdDlaApc", long_options, &option_index)) >= 0) {
- switch (c) {
- case 's':
- if (argc < 5) {
- show_usage ();
- exit (1);
- }
- set = 1;
- break;
- case 'd':
- if (argc < 3) {
- show_usage ();
- return 1;
- }
- set = 0;
- delete = 1;
- break;
-
- case 'D':
- delete = 0;
- set = 0;
- delete_all = 1;
- break;
-
- case 'l':
- set = 0;
- delete = 0;
- delete_all = 0;
- break;
-
- case 'p':
- subject_is_port = 1;
- break;
-
- case 'c':
- subject_is_client = 1;
- break;
-
- case '?':
- default:
- show_usage ();
- exit (1);
- }
- }
-
- if ((client = jack_client_open ("jack-property", options, NULL)) == 0) {
- fprintf (stderr, "Cannot connect to JACK server\n");
- exit (1);
- }
-
- if (delete_all) {
-
- if (jack_remove_all_properties (client) == 0) {
- printf ("JACK metadata successfully delete\n");
- exit (0);
- }
- exit (1);
- }
-
- if (delete) {
-
- int args_left = argc - optind;
-
- if (args_left < 1) {
- show_usage ();
- exit (1);
- }
-
- /* argc == 3: delete all properties for a subject
- argc == 4: delete value of key for subject
- */
-
- if (args_left >= 2) {
-
- if (get_subject (client, argv, &optind)) {
- return 1;
- }
-
- key = argv[optind++];
-
- if (jack_remove_property (client, uuid, key)) {
- fprintf (stderr, "\"%s\" property not removed for %s\n", key, subject);
- exit (1);
- }
-
- } else {
-
- if (get_subject (client, argv, &optind)) {
- return 1;
- }
-
- if (jack_remove_properties (client, uuid) < 0) {
- fprintf (stderr, "cannot remove properties for UUID %s\n", subject);
- exit (1);
- }
- }
-
- } else if (set) {
-
- int args_left = argc - optind;
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- key = argv[optind++];
- value = argv[optind++];
-
- if (args_left >= 3) {
- type = argv[optind++];
- } else {
- type = "";
- }
-
- if (jack_set_property (client, uuid, key, value, type)) {
- fprintf (stderr, "cannot set value for key %s of %s\n", value, subject);
- exit (1);
- }
-
- } else {
-
- /* list properties */
-
- int args_left = argc - optind;
-
- if (args_left >= 2) {
-
- /* list properties for a UUID/key pair */
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- key = argv[optind++];
-
- if (jack_get_property (uuid, key, &value, &type) == 0) {
- printf ("%s\n", value);
- free (value);
- if (type) {
- free (type);
- }
- } else {
- fprintf (stderr, "Value not found for %s of %s\n", key, subject);
- exit (1);
- }
-
- } else if (args_left == 1) {
-
- /* list all properties for a given UUID */
-
- jack_description_t description;
- size_t cnt, n;
-
- if (get_subject (client, argv, &optind)) {
- return -1;
- }
-
- if ((cnt = jack_get_properties (uuid, &description)) < 0) {
- fprintf (stderr, "could not retrieve properties for %s\n", subject);
- exit (1);
- }
-
- for (n = 0; n < cnt; ++n) {
- if (description.properties[n].type) {
- printf ("key: %s value: %s type: %s\n",
- description.properties[n].key,
- description.properties[n].data,
- description.properties[n].type);
- } else {
- printf ("key: %s value: %s\n",
- description.properties[n].key,
- description.properties[n].data);
- }
- }
-
- jack_free_description (&description, 0);
-
- } else {
-
- /* list all properties */
-
- jack_description_t* description;
- size_t cnt;
- size_t p;
- size_t n;
- char buf[JACK_UUID_STRING_SIZE];
-
- if ((cnt = jack_get_all_properties (&description)) < 0) {
- fprintf (stderr, "could not retrieve properties for %s\n", subject);
- exit (1);
- }
-
- for (n = 0; n < cnt; ++n) {
- jack_uuid_unparse (description[n].subject, buf);
- printf ("%s\n", buf);
- for (p = 0; p < description[n].property_cnt; ++p) {
- if (description[n].properties[p].type) {
- printf ("key: %s value: %s type: %s\n",
- description[n].properties[p].key,
- description[n].properties[p].data,
- description[n].properties[p].type);
- } else {
- printf ("key: %s value: %s\n",
- description[n].properties[p].key,
- description[n].properties[p].data);
- }
- }
- jack_free_description (&description[n], 0);
- }
-
- free (description);
- }
- }
-
-
- (void) jack_client_close (client);
- return 0;
- }
|