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