xref: /haiku/src/add-ons/tracker/opentargetfolder/opentargetfolder.cpp (revision 969a5d2fac18758844b4653622181d4863ea6817)
16450ea18SAxel Dörfler /*
26450ea18SAxel Dörfler  * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de.
32634c397SJohn Scipione  * Copyright 2015 Haiku, Inc. All rights reserved.
46450ea18SAxel Dörfler  * Distributed under the terms of the MIT License.
5ff8afc9bSJohn Scipione  *
6ff8afc9bSJohn Scipione  * Authors:
7ff8afc9bSJohn Scipione  *		Axel Dörfler, axeld@pinc-software.de
82634c397SJohn Scipione  *		John Scipione, jscipione@gmail.com
96450ea18SAxel Dörfler  */
106450ea18SAxel Dörfler 
11ff8afc9bSJohn Scipione 
126450ea18SAxel Dörfler //! Open Target Folder - opens the folder of the link target in Tracker
136450ea18SAxel Dörfler 
14ff8afc9bSJohn Scipione 
156450ea18SAxel Dörfler #include <stdio.h>
166450ea18SAxel Dörfler #include <string.h>
176450ea18SAxel Dörfler 
186450ea18SAxel Dörfler #include <Alert.h>
196450ea18SAxel Dörfler #include <Entry.h>
206450ea18SAxel Dörfler #include <Messenger.h>
216450ea18SAxel Dörfler #include <Path.h>
226450ea18SAxel Dörfler #include <SymLink.h>
236450ea18SAxel Dörfler 
24ff8afc9bSJohn Scipione #include <tracker_private.h>
25ff8afc9bSJohn Scipione 
266450ea18SAxel Dörfler 
279cdba41aSJohn Scipione using namespace BPrivate;
289cdba41aSJohn Scipione 
296450ea18SAxel Dörfler extern "C" void
process_refs(entry_ref directoryRef,BMessage * message,void *)30ff8afc9bSJohn Scipione process_refs(entry_ref directoryRef, BMessage* message, void*)
316450ea18SAxel Dörfler {
326450ea18SAxel Dörfler 	entry_ref ref;
339cdba41aSJohn Scipione 	uint32 selectCount = 0;
349cdba41aSJohn Scipione 
359cdba41aSJohn Scipione 	// create Tracker messenger...
369cdba41aSJohn Scipione 	BMessenger messenger(kTrackerSignature);
379cdba41aSJohn Scipione 
389cdba41aSJohn Scipione 	// create select message...
399cdba41aSJohn Scipione 	BMessage selectMessage(kSelect);
40ff8afc9bSJohn Scipione 
41ff8afc9bSJohn Scipione 	for (int32 i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) {
426450ea18SAxel Dörfler 		BSymLink link(&ref);
436450ea18SAxel Dörfler 		if (link.InitCheck() != B_OK || !link.IsSymLink()) {
44aed35104SHumdinger 			BAlert* alert = new BAlert("Open Target Folder",
456450ea18SAxel Dörfler 				"This add-on can only be used on symbolic links.\n"
466450ea18SAxel Dörfler 				"It opens the folder of the link target in Tracker.",
47aed35104SHumdinger 				"OK");
48aed35104SHumdinger 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
49aed35104SHumdinger 			alert->Go(NULL);
502634c397SJohn Scipione 			break;
512634c397SJohn Scipione 		}
522634c397SJohn Scipione 
53*969a5d2fSJohn Scipione 		BEntry targetEntry(&ref, true);
542634c397SJohn Scipione 		if (targetEntry.InitCheck() != B_OK) {
552634c397SJohn Scipione 			BAlert* alert = new BAlert("Open Target Folder",
562634c397SJohn Scipione 				"Cannot open target entry. Maybe this link is broken?",
572634c397SJohn Scipione 				"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
582634c397SJohn Scipione 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
592634c397SJohn Scipione 			alert->Go(NULL);
602634c397SJohn Scipione 			break;
612634c397SJohn Scipione 		}
622634c397SJohn Scipione 
632634c397SJohn Scipione 		BEntry parentEntry;
642634c397SJohn Scipione 		if (targetEntry.GetParent(&parentEntry) != B_OK) {
652634c397SJohn Scipione 			BAlert* alert = new BAlert("Open Target Folder",
662634c397SJohn Scipione 				"Cannot open target entry folder. Maybe this link is broken?",
672634c397SJohn Scipione 				"OK", NULL, NULL, B_WIDTH_AS_USUAL, B_WARNING_ALERT);
682634c397SJohn Scipione 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
692634c397SJohn Scipione 			alert->Go(NULL);
702634c397SJohn Scipione 			break;
712634c397SJohn Scipione 		}
722634c397SJohn Scipione 
732634c397SJohn Scipione 		entry_ref parent;
742634c397SJohn Scipione 		if (parentEntry.GetRef(&parent) != B_OK) {
752634c397SJohn Scipione 			BAlert* alert = new BAlert("Open Target Folder",
762634c397SJohn Scipione 				"Unable to locate entry_ref for the target entry folder.",
772634c397SJohn Scipione 				"OK");
782634c397SJohn Scipione 			alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
792634c397SJohn Scipione 			alert->Go(NULL);
802634c397SJohn Scipione 			break;
812634c397SJohn Scipione 		}
822634c397SJohn Scipione 
832634c397SJohn Scipione 		// create Tracker message...
842634c397SJohn Scipione 		BMessage trackerMessage(B_REFS_RECEIVED);
852634c397SJohn Scipione 		trackerMessage.AddRef("refs", &parent);
862634c397SJohn Scipione 
872634c397SJohn Scipione 		// ...and send it
882634c397SJohn Scipione 		messenger.SendMessage(&trackerMessage);
892634c397SJohn Scipione 
909cdba41aSJohn Scipione 		entry_ref target;
919cdba41aSJohn Scipione 		if (targetEntry.GetRef(&target) != B_OK) {
929cdba41aSJohn Scipione 			// don't alert, selection is not critical
939cdba41aSJohn Scipione 			break;
946450ea18SAxel Dörfler 		}
959cdba41aSJohn Scipione 
969cdba41aSJohn Scipione 		// add ref to selection message
979cdba41aSJohn Scipione 		selectMessage.AddRef("refs", &target);
989cdba41aSJohn Scipione 		selectCount++;
999cdba41aSJohn Scipione 	}
1009cdba41aSJohn Scipione 
1019cdba41aSJohn Scipione 	// ...and send it
1029cdba41aSJohn Scipione 	if (selectCount > 0)
1039cdba41aSJohn Scipione 		messenger.SendMessage(&selectMessage);
1046450ea18SAxel Dörfler }
1056450ea18SAxel Dörfler 
1066450ea18SAxel Dörfler 
1076450ea18SAxel Dörfler int
main(int,char **)1086450ea18SAxel Dörfler main(int /*argc*/, char** /*argv*/)
1096450ea18SAxel Dörfler {
1106450ea18SAxel Dörfler 	fprintf(stderr, "This can only be used as a Tracker add-on.\n");
1116450ea18SAxel Dörfler 	return -1;
1126450ea18SAxel Dörfler }
113