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