1 /* 2 * Copyright 2007 - 2009 Chris Roberts. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Chris Roberts, cpr420@gmail.com 7 */ 8 9 #include <StorageKit.h> 10 #include <SupportKit.h> 11 #include <AppKit.h> 12 13 #include <vector> 14 15 #include <add-ons/tracker/TrackerAddOn.h> 16 17 const char* kTerminalSignature = "application/x-vnd.Haiku-Terminal"; 18 19 static void 20 launch_terminal(BEntry& targetEntry) { 21 BPath targetPath; 22 23 if (targetEntry.GetPath(&targetPath) != B_OK) 24 return; 25 26 // Launch the Terminal. 27 const char* argv[] = {"-w", targetPath.Path(), NULL}; 28 be_roster->Launch(kTerminalSignature, 2, argv); 29 } 30 31 32 void 33 process_refs(entry_ref base_ref, BMessage* message, void* reserved) 34 { 35 BEntry entry; 36 int32 i; 37 entry_ref tracker_ref; 38 std::vector<BEntry> entries; 39 40 // Iterate through the refs that Tracker has sent us. 41 for (i = 0; message->FindRef("refs", i, &tracker_ref) == B_OK; i++) { 42 43 // Pass 'true' as the traverse argument below, so that if the ref 44 // is a symbolic link we get the target of the link to ensure that 45 // it actually exists. 46 if (entry.SetTo(&tracker_ref, true) != B_OK) 47 continue; 48 49 // If the entry is a file then look for the parent directory. 50 if (!entry.IsDirectory()) { 51 if (entry.GetParent(&entry) != B_OK) 52 continue; 53 } 54 55 bool duplicate = false; 56 57 // Check for duplicates. 58 for (uint x = 0; x < entries.size(); x++) { 59 if (entries[x] == entry) { 60 duplicate = true; 61 break; 62 } 63 } 64 65 // This is a duplicate. Continue to next ref. 66 if (duplicate) 67 continue; 68 69 // Push entry onto the vector so we can check for duplicates later. 70 entries.push_back(BEntry(entry)); 71 72 launch_terminal(entry); 73 } 74 75 // If nothing was selected we'll use the base folder. 76 if (i == 0) { 77 if (entry.SetTo(&base_ref) == B_OK) 78 launch_terminal(entry); 79 } 80 } 81