diff --git a/src/bin/open.cpp b/src/bin/open.cpp index e1aed07048..3d782bf08c 100644 --- a/src/bin/open.cpp +++ b/src/bin/open.cpp @@ -1,53 +1,55 @@ /* - * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. - * Copyright 2005-2006, François Revol, revol@free.fr. + * Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2005-2007, François Revol, revol@free.fr. * Distributed under the terms of the MIT License. */ -/* Launches an application/document from the shell */ +/*! Launches an application/document from the shell */ -#include #include -#include #include +#include +#include +#include #include #include #include -#include const char *kTrackerSignature = "application/x-vnd.Be-TRAK"; -const char *openWith = NULL; - -status_t OpenFile(BEntry &entry, int32 line=-1, int32 col=-1) +status_t +open_file(const char* openWith, BEntry &entry, int32 line = -1, int32 col = -1) { - status_t status; entry_ref ref; - entry.GetRef(&ref); + status_t status = entry.GetRef(&ref); + if (status < B_OK) + return status; - BMessenger target(openWith?openWith:kTrackerSignature); - if (target.IsValid()) { - BMessage message(B_REFS_RECEIVED); - message.AddRef("refs", &ref); - if (line > -1) - message.AddInt32("be:line", line); - if (col > -1) - message.AddInt32("be:column", col); - // tell the app to open the file - status = target.SendMessage(&message); - } else - status = be_roster->Launch(&ref); - return status; + BMessenger target(openWith ? openWith : kTrackerSignature); + if (!target.IsValid()) + return be_roster->Launch(&ref); + + BMessage message(B_REFS_RECEIVED); + message.AddRef("refs", &ref); + if (line > -1) + message.AddInt32("be:line", line); + if (col > -1) + message.AddInt32("be:column", col); + + // tell the app to open the file + return target.SendMessage(&message); } + int main(int argc, char **argv) { int exitcode = EXIT_SUCCESS; + const char *openWith = NULL; char *progName = argv[0]; if (strrchr(progName, '/')) @@ -62,14 +64,12 @@ main(int argc, char **argv) BEntry entry(*argv); if ((status = entry.InitCheck()) == B_OK && entry.Exists()) { - status = OpenFile(entry); + status = open_file(openWith, entry); } else if (!strncasecmp("application/", *argv, 12)) { // maybe it's an application-mimetype? - + // subsequent files are open with that app openWith = *argv; - // clear possible ENOENT from above - status = B_OK; // in the case the app is already started, // don't start it twice if we have other args @@ -79,6 +79,8 @@ main(int argc, char **argv) if (teams.IsEmpty()) status = be_roster->Launch(*argv); + else + status = B_OK; } else if (strchr(*argv, ':')) { // try to open it as an URI BString mimeType = "application/x-vnd.Be.URL."; @@ -89,37 +91,40 @@ main(int argc, char **argv) mimeType.Append(arg, arg.FindFirst(":")); char *args[2] = { *argv, NULL }; - status = be_roster->Launch(openWith?openWith:mimeType.String(), 1, args); + status = be_roster->Launch(openWith ? openWith : mimeType.String(), 1, args); if (status == B_OK) continue; - + // maybe it's "file:line" or "file:line:col" int line = 0, col = 0, i; status = B_ENTRY_NOT_FOUND; // remove gcc error's last : - if (arg[arg.Length()-1] == ':') - arg.Truncate(arg.Length()-1); + if (arg[arg.Length() - 1] == ':') + arg.Truncate(arg.Length() - 1); + i = arg.FindLast(':'); if (i > 0) { - line = atoi(arg.String()+i+1); + line = atoi(arg.String() + i + 1); arg.Truncate(i); - entry.SetTo(arg.String()); - if (entry.Exists()) - status = OpenFile(entry, line-1, col-1); + + status = entry.SetTo(arg.String()); + if (status == B_OK && entry.Exists()) + status = open_file(openWith, entry, line - 1, col - 1); if (status == B_OK) continue; - // get the col + + // get the column col = line; i = arg.FindLast(':'); - line = atoi(arg.String()+i+1); + line = atoi(arg.String() + i + 1); arg.Truncate(i); - entry.SetTo(arg.String()); - if (entry.Exists()) - status = OpenFile(entry, line-1, col-1); + + status = entry.SetTo(arg.String()); + if (status == B_OK && entry.Exists()) + status = open_file(openWith, entry, line - 1, col - 1); } - } else { + } else status = B_ENTRY_NOT_FOUND; - } if (status != B_OK && status != B_ALREADY_RUNNING) { fprintf(stderr, "%s: \"%s\": %s\n", progName, *argv, strerror(status));