bool AddURLToCurrentCommandLine(const char* aURL) { if (!sBuildingCommandLine) { return false; } AddToCommandLine("-url"); AddToCommandLine(aURL); return true; }
PRBool AddURLToCurrentCommandLine(const char* aURL) { if (!sBuildingCommandLine) { return PR_FALSE; } AddToCommandLine("-url"); AddToCommandLine(aURL); return PR_TRUE; }
//---------------------------------------------------------------------------------------- nsresult nsMacCommandLine::Initialize(int& argc, char**& argv) //---------------------------------------------------------------------------------------- { mArgs = static_cast<char **>(malloc(kArgsGrowSize * sizeof(char *))); if (!mArgs) return NS_ERROR_FAILURE; mArgs[0] = nsnull; mArgsAllocated = kArgsGrowSize; mArgsUsed = 0; // Here, we may actually get useful args. // Copy them first to mArgv. for (int arg = 0; arg < argc; arg++) AddToCommandLine(argv[arg]); // Set up AppleEvent handling. OSErr err = CreateAEHandlerClasses(false); if (err != noErr) return NS_ERROR_FAILURE; // Snarf all the odoc and pdoc apple-events. // // 1. If they are odoc for 'CMDL' documents, read them into the buffer ready for // parsing (concatenating multiple files). // // 2. If they are any other kind of document, convert them into -url command-line // parameters or -print parameters, with file URLs. EventRecord anEvent; for (short i = 1; i < 5; i++) ::WaitNextEvent(0, &anEvent, 0, nsnull); while (::EventAvail(highLevelEventMask, &anEvent)) { ::WaitNextEvent(highLevelEventMask, &anEvent, 0, nsnull); if (anEvent.what == kHighLevelEvent) { // here we process startup odoc/pdoc events, which can // add items to the command line. err = ::AEProcessAppleEvent(&anEvent); } } if (::GetCurrentEventKeyModifiers() & optionKey) AddToCommandLine("-p"); // we've started up now mStartedUp = PR_TRUE; argc = mArgsUsed; argv = mArgs; return NS_OK; }
//---------------------------------------------------------------------------------------- OSErr nsMacCommandLine::DispatchURLToNewBrowser(const char* url) //---------------------------------------------------------------------------------------- { OSErr err = errAEEventNotHandled; if (mStartedUp) return OpenURL(url); else { err = AddToCommandLine("-url"); if (err == noErr) err = AddToCommandLine(url); } return err; }
//---------------------------------------------------------------------------------------- nsresult nsMacCommandLine::AddToCommandLine(const char* inOptionString, const FSSpec& inFileSpec) //---------------------------------------------------------------------------------------- { // Convert the filespec to a URL FSSpec nonConstSpec = inFileSpec; nsCOMPtr<nsILocalFileMac> inFile; nsresult rv = NS_NewLocalFileWithFSSpec(&nonConstSpec, PR_TRUE, getter_AddRefs(inFile)); if (NS_FAILED(rv)) return rv; nsCAutoString specBuf; rv = NS_GetURLSpecFromFile(inFile, specBuf); if (NS_FAILED(rv)) return rv; AddToCommandLine(inOptionString); AddToCommandLine(specBuf.get()); return NS_OK; }
void SetupMacCommandLine(int& argc, char**& argv, PRBool forRestart) { sArgs = static_cast<char **>(malloc(kArgsGrowSize * sizeof(char*))); if (!sArgs) return; sArgsAllocated = kArgsGrowSize; sArgs[0] = NULL; sArgsUsed = 0; sBuildingCommandLine = PR_TRUE; // Copy args, stripping anything we don't want. for (int arg = 0; arg < argc; arg++) { char* flag = argv[arg]; // Don't pass on the psn (Process Serial Number) flag from the OS. if (strncmp(flag, "-psn_", 5) != 0) AddToCommandLine(flag); } // Force processing of any pending Apple GetURL Events while we're building // the command line. The handlers will append to the command line rather than // act directly so there is no chance we'll process them during a XUL window // load and accidentally open unnecessary windows and home pages. ProcessPendingGetURLAppleEvents(); // If the process will be relaunched, the child should be in the foreground // if the parent is in the foreground. This will be communicated in a // command-line argument to the child. if (forRestart) { Boolean isForeground = false; ProcessSerialNumber psnSelf, psnFront; if (::GetCurrentProcess(&psnSelf) == noErr && ::GetFrontProcess(&psnFront) == noErr && ::SameProcess(&psnSelf, &psnFront, &isForeground) == noErr && isForeground) { AddToCommandLine("-foreground"); } } sBuildingCommandLine = PR_FALSE; argc = sArgsUsed; argv = sArgs; }
//---------------------------------------------------------------------------------------- OSErr nsMacCommandLine::HandlePrintOneDoc(const FSSpec& inFileSpec, OSType fileType) //---------------------------------------------------------------------------------------- { // If we are starting up the application, // add a command-line "-print" argument to the global list. This means that if // the app is opened with documents on the mac, they'll be handled the same // way as if they had been typed on the command line in Unix or DOS. if (!mStartedUp) return AddToCommandLine("-print", inFileSpec); // Final case: we're not just starting up. How do we handle this? NS_NOTYETIMPLEMENTED("Write Me"); return errAEEventNotHandled; }
//---------------------------------------------------------------------------------------- OSErr nsMacCommandLine::HandleOpenOneDoc(const FSSpec& inFileSpec, OSType inFileType) //---------------------------------------------------------------------------------------- { nsCOMPtr<nsILocalFileMac> inFile; nsresult rv = NS_NewLocalFileWithFSSpec(&inFileSpec, PR_TRUE, getter_AddRefs(inFile)); if (NS_FAILED(rv)) return errAEEventNotHandled; if (!mStartedUp) { // Is it the right type to be a command-line file? if (inFileType == 'TEXT' || inFileType == 'CMDL') { // Can we open the file? FILE *fp = 0; rv = inFile->OpenANSIFileDesc("r", &fp); if (NS_SUCCEEDED(rv)) { Boolean foundArgs = false; Boolean foundEnv = false; char chars[1024]; static const char kCommandLinePrefix[] = "ARGS:"; static const char kEnvVarLinePrefix[] = "ENV:"; while (ReadLine(fp, chars, sizeof(chars)) != -1) { // See if there are any command line or environment var settings if (PL_strstr(chars, kCommandLinePrefix) == chars) { (void)AddToCommandLine(chars + sizeof(kCommandLinePrefix) - 1); foundArgs = true; } else if (PL_strstr(chars, kEnvVarLinePrefix) == chars) { (void)AddToEnvironmentVars(chars + sizeof(kEnvVarLinePrefix) - 1); foundEnv = true; } } fclose(fp); #ifndef XP_MACOSX // If we found any environment vars we need to re-init NSPR's logging // so that it knows what the new vars are if (foundEnv) PR_Init_Log(); #endif // If we found a command line or environment vars we want to return now // raather than trying to open the file as a URL if (foundArgs || foundEnv) return noErr; } } // If it's not a command-line argument, and we are starting up the application, // add a command-line "-url" argument to the global list. This means that if // the app is opened with documents on the mac, they'll be handled the same // way as if they had been typed on the command line in Unix or DOS. return AddToCommandLine("-url", inFileSpec); } // Final case: we're not just starting up. How do we handle this? nsCAutoString specBuf; rv = NS_GetURLSpecFromFile(inFile, specBuf); if (NS_FAILED(rv)) return errAEEventNotHandled; return OpenURL(specBuf.get()); }