xref: /haiku/src/bin/desklink/desklink.cpp (revision fce4895d1884da5ae6fb299d23c735c598e690b1)
1 /*
2  * Copyright 2003-2009, Haiku. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Jérôme Duval
7  *		François Revol
8  *		Marcus Overhagen
9  *		Jonas Sundström
10  */
11 
12 //! VolumeControl and link items in Deskbar
13 
14 #include "desklink.h"
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 
19 #include <Alert.h>
20 #include <Application.h>
21 #include <Deskbar.h>
22 #include <MimeType.h>
23 #include <Roster.h>
24 #include <String.h>
25 
26 #include "DeskButton.h"
27 #include "VolumeWindow.h"
28 
29 
30 const char *kAppSignature = "application/x-vnd.Haiku-desklink";
31 	// the application signature used by the replicant to find the
32 	// supporting code
33 
34 
35 int
36 main(int, char **argv)
37 {
38 	BApplication app(kAppSignature);
39 	bool atLeastOnePath = false;
40 	BList titleList;
41 	BList actionList;
42 	BDeskbar deskbar;
43 	status_t err = B_OK;
44 
45 	for (int32 i = 1; argv[i]!=NULL; i++) {
46 		if (strcmp(argv[i], "--help") == 0)
47 			break;
48 
49 		if (strcmp(argv[i], "--list") == 0) {
50 			int32 count = deskbar.CountItems();
51 			int32 found = 0;
52 			int32 j = 0;
53 			printf("Deskbar items:\n");
54 
55 			while (found < count) {
56 				const char *name = NULL;
57 				if (deskbar.GetItemInfo(j, &name) == B_OK) {
58 					printf("Item %" B_PRId32 ": '%s'\n", j, name);
59 					free((void *)name);
60 					found++;
61 				}
62 				j++;
63 			}
64 			return 0;
65 		}
66 
67 		if (strcmp(argv[i], "--add-volume") == 0) {
68 			entry_ref ref;
69 			if (get_ref_for_path(argv[0], &ref) == B_OK) {
70 				deskbar.AddItem(&ref);
71 			}
72 			return 0;
73 		}
74 
75 		if (strcmp(argv[i], "--volume-control") == 0) {
76 			BWindow* window = new VolumeWindow(BRect(200, 150, 400, 200));
77 			window->Show();
78 
79 			wait_for_thread(window->Thread(), NULL);
80 			return 0;
81 		}
82 
83 		if (strncmp(argv[i], "--remove", 8) == 0) {
84 			BString replicant = "DeskButton";
85 			if (strncmp(argv[i] + 8, "=", 1) == 0) {
86 				if (strlen(argv[i] + 9) > 0) {
87 					replicant = argv[i] + 9;
88 				} else {
89 					printf("desklink: Missing replicant name.\n");
90 					return 1;
91 				}
92 			}
93 			int32 found = 0;
94 			int32 found_id;
95 			while (deskbar.GetItemInfo(replicant.String(), &found_id) == B_OK) {
96 				err = deskbar.RemoveItem(found_id);
97 				if (err != B_OK) {
98 					printf("desklink: Error removing replicant id "
99 						"%" B_PRId32 ": %s\n", found_id, strerror(err));
100 					break;
101 				}
102 				found++;
103 			}
104 			printf("Removed %" B_PRId32 " items.\n", found);
105 			return err;
106 		}
107 
108 		if (strncmp(argv[i], "cmd=", 4) == 0) {
109 			BString *title = new BString(argv[i] + 4);
110 			int32 index = title->FindFirst(':');
111 			if (index <= 0) {
112 				printf("desklink: usage: cmd=title:action\n");
113 			} else {
114 				title->Truncate(index);
115 				BString *action = new BString(argv[i] + 4);
116 				action->Remove(0, index+1);
117 				titleList.AddItem(title);
118 				actionList.AddItem(action);
119 			}
120 			continue;
121 		}
122 
123 		atLeastOnePath = true;
124 
125 		BEntry entry(argv[i], true);
126 		entry_ref ref;
127 
128 		if (entry.Exists()) {
129 			entry.GetRef(&ref);
130 		} else if (BMimeType::IsValid(argv[i])) {
131 			if (be_roster->FindApp(argv[i], &ref) != B_OK) {
132 				printf("desklink: cannot find '%s'\n", argv[i]);
133 				return 1;
134 			}
135 		} else {
136 			printf("desklink: cannot find '%s'\n", argv[i]);
137 			return 1;
138 		}
139 
140 		err = deskbar.AddItem(&ref);
141 		if (err != B_OK) {
142 			err = deskbar.AddItem(new DeskButton(BRect(0, 0, 15, 15),
143 				&ref, ref.name, titleList, actionList));
144 			if (err != B_OK) {
145 				printf("desklink: Deskbar refuses link to '%s': %s\n", argv[i], strerror(err));
146 				return 1;
147 			}
148 		}
149 
150 		titleList.MakeEmpty();
151 		actionList.MakeEmpty();
152 	}
153 
154 	if (!atLeastOnePath) {
155 		printf(	"usage: desklink { [ --list|--remove|[cmd=title:action ... ] [ path|signature ] } ...\n"
156 			"--add-volume: install volume control into Deskbar.\n"
157 			"--volume-control: show window with global volume control.\n"
158 			"--list: list all Deskbar addons.\n"
159 			"--remove: remove all desklink addons.\n"
160 			"--remove=name: remove all 'name' addons.\n");
161 		return 1;
162 	}
163 
164 	return 0;
165 }
166