xref: /haiku/src/add-ons/tracker/opentargetfolder/opentargetfolder.cpp (revision 969a5d2fac18758844b4653622181d4863ea6817)
1 /*
2  * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2015 Haiku, Inc. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  *
6  * Authors:
7  *		Axel Dörfler, axeld@pinc-software.de
8  *		John Scipione, jscipione@gmail.com
9  */
10 
11 
12 //! Open Target Folder - opens the folder of the link target in Tracker
13 
14 
15 #include <stdio.h>
16 #include <string.h>
17 
18 #include <Alert.h>
19 #include <Entry.h>
20 #include <Messenger.h>
21 #include <Path.h>
22 #include <SymLink.h>
23 
24 #include <tracker_private.h>
25 
26 
27 using namespace BPrivate;
28 
29 extern "C" void
process_refs(entry_ref directoryRef,BMessage * message,void *)30 process_refs(entry_ref directoryRef, BMessage* message, void*)
31 {
32 	entry_ref ref;
33 	uint32 selectCount = 0;
34 
35 	// create Tracker messenger...
36 	BMessenger messenger(kTrackerSignature);
37 
38 	// create select message...
39 	BMessage selectMessage(kSelect);
40 
41 	for (int32 i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) {
42 		BSymLink link(&ref);
43 		if (link.InitCheck() != B_OK || !link.IsSymLink()) {
44 			BAlert* alert = new BAlert("Open Target Folder",
45 				"This add-on can only be used on symbolic links.\n"
46 				"It opens the folder of the link target in Tracker.",
47 				"OK");
48 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
49 			alert->Go(NULL);
50 			break;
51 		}
52 
53 		BEntry targetEntry(&ref, true);
54 		if (targetEntry.InitCheck() != B_OK) {
55 			BAlert* alert = new BAlert("Open Target Folder",
56 				"Cannot open target entry. Maybe this link is broken?",
57 				"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
58 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
59 			alert->Go(NULL);
60 			break;
61 		}
62 
63 		BEntry parentEntry;
64 		if (targetEntry.GetParent(&parentEntry) != B_OK) {
65 			BAlert* alert = new BAlert("Open Target Folder",
66 				"Cannot open target entry folder. Maybe this link is broken?",
67 				"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
68 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
69 			alert->Go(NULL);
70 			break;
71 		}
72 
73 		entry_ref parent;
74 		if (parentEntry.GetRef(&parent) != B_OK) {
75 			BAlert* alert = new BAlert("Open Target Folder",
76 				"Unable to locate entry_ref for the target entry folder.",
77 				"OK");
78 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
79 			alert->Go(NULL);
80 			break;
81 		}
82 
83 		// create Tracker message...
84 		BMessage trackerMessage(B_REFS_RECEIVED);
85 		trackerMessage.AddRef("refs", &parent);
86 
87 		// ...and send it
88 		messenger.SendMessage(&trackerMessage);
89 
90 		entry_ref target;
91 		if (targetEntry.GetRef(&target) != B_OK) {
92 			// don't alert, selection is not critical
93 			break;
94 		}
95 
96 		// add ref to selection message
97 		selectMessage.AddRef("refs", &target);
98 		selectCount++;
99 	}
100 
101 	// ...and send it
102 	if (selectCount > 0)
103 		messenger.SendMessage(&selectMessage);
104 }
105 
106 
107 int
main(int,char **)108 main(int /*argc*/, char** /*argv*/)
109 {
110 	fprintf(stderr, "This can only be used as a Tracker add-on.\n");
111 	return -1;
112 }
113