1/*
2 * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6//! Open Target Folder - opens the folder of the link target in Tracker
7
8#include <stdio.h>
9#include <string.h>
10
11#include <Alert.h>
12#include <Directory.h>
13#include <Entry.h>
14#include <Messenger.h>
15#include <Path.h>
16#include <SymLink.h>
17
18
19extern "C" void
20process_refs(entry_ref directoryRef, BMessage *msg, void *)
21{
22	BDirectory directory(&directoryRef);
23	if (directory.InitCheck() != B_OK)
24		return;
25
26	int32 errors = 0;
27	entry_ref ref;
28	int32 index;
29	for (index = 0; msg->FindRef("refs", index, &ref) == B_OK; index ++) {
30		BSymLink link(&ref);
31		if (link.InitCheck() != B_OK || !link.IsSymLink()) {
32			errors++;
33			continue;
34		}
35
36		BEntry targetEntry;
37		BPath path;
38		if (link.MakeLinkedPath(&directory, &path) < B_OK
39			|| targetEntry.SetTo(path.Path()) != B_OK
40			|| targetEntry.GetParent(&targetEntry) != B_OK) {
41			BAlert* alert = new BAlert("Open Target Folder",
42				"Cannot open target folder. Maybe this link is broken?",
43				"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
44			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
45			alert->Go(NULL);
46			continue;
47		}
48
49		// create Tracker message...
50		entry_ref target;
51		targetEntry.GetRef(&target);
52
53		BMessage message(B_REFS_RECEIVED);
54		message.AddRef("refs", &target);
55
56		// ...and send it
57		BMessenger messenger("application/x-vnd.Be-TRAK");
58		messenger.SendMessage(&message);
59
60		// TODO: select entry via scripting?
61	}
62
63	if (errors) {
64		BAlert* alert = new BAlert("Open Target Folder",
65			"This add-on can only be used on symbolic links.\n"
66			"It opens the folder of the link target in Tracker.",
67			"OK");
68		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
69		alert->Go(NULL);
70	}
71}
72
73
74int
75main(int /*argc*/, char **/*argv*/)
76{
77	fprintf(stderr, "This can only be used as a Tracker add-on.\n");
78	return -1;
79}
80