void DoErrorAlert(OSStatus status, CFStringRef errorFormatString) { CFStringRef formatStr = NULL, printErrorMsg = NULL; SInt16 alertItemHit = 0; Str255 stringBuf; if ((status != noErr) && (status != 2)) { formatStr = CFCopyLocalizedString (errorFormatString, NULL); if (formatStr != NULL) { printErrorMsg = CFStringCreateWithFormat( NULL, NULL, formatStr, status); if (printErrorMsg != NULL) { if (CFStringGetPascalString ( printErrorMsg, stringBuf, sizeof(stringBuf), GetApplicationTextEncoding())) { StandardAlert(kAlertStopAlert, stringBuf, NULL, NULL, &alertItemHit); } CFRelease (printErrorMsg); } CFRelease (formatStr); } } }
void WarningMsg(const char *string){ Str255 msg; c2pstrcpy(msg, string); SInt16 ret; StandardAlert(kAlertCautionAlert, msg, NULL, NULL, &ret); }
void InfoMsg(const char *string){ Str255 msg; c2pstrcpy(msg, string); SInt16 ret; StandardAlert(kAlertNoteAlert, msg, NULL, NULL, &ret); }
bool AquaGui::init(int argc, char **argv[]) /* Self-explainatory */ { OSErr err; long response; Str255 text = " OS X version lower than 10.4 is not supported!", tmp = ""; /* Version check */ err = Gestalt(gestaltSystemVersion, &response); Boolean ok = ((err == noErr) && (response >= 0x00001040)); if (!ok) { StandardAlert(kAlertStopAlert, text, tmp, NULL, NULL); ExitToShell(); } _glue.init(argc, argv); _renderer = _glue.createRenderHandler(); if(!_renderer)return false; set_render_handler(_renderer); return true; }
void ErrorMsg(const char *string){ Str255 msg; c2pstrcpy(msg, string); SInt16 ret; StandardAlert(kAlertStopAlert, msg, NULL, NULL, &ret); }
static Boolean ShowMessage(Boolean allowCancel, const char *format, ...) { va_list args; char s[1024]; short itemHit; AlertStdAlertParamRec alertParams; ProcessSerialNumber ourProcess; va_start(args, format); s[0] = vsprintf(s+1, format, args); va_end(args); alertParams.movable = true; alertParams.helpButton = false; alertParams.filterProc = NULL; alertParams.defaultText = (StringPtr)"\pYes"; alertParams.cancelText = allowCancel ? (StringPtr)"\pNo" : NULL; alertParams.otherText = NULL; alertParams.defaultButton = kAlertStdAlertOKButton; alertParams.cancelButton = allowCancel ? kAlertStdAlertCancelButton : 0; alertParams.position = kWindowDefaultPosition; ::GetCurrentProcess (&ourProcess); ::SetFrontProcess(&ourProcess); StandardAlert (kAlertNoteAlert, (StringPtr)s, NULL, &alertParams, &itemHit); return (itemHit == kAlertStdAlertOKButton); }
/* XOPEmergencyAlert(message) This routine used by the XOP Toolkit for dire emergencies only. You should not need it. Use XOPOKAlert instead. Thread Safety: XOPEmergencyAlert is not thread-safe. */ void XOPEmergencyAlert(const char* message) { Str255 pTitle; Str255 pMessage; SInt16 itemHit; CopyCStringToPascal("Emergency", pTitle); CopyCStringToPascal(message, pMessage); StandardAlert(kAlertStopAlert, pTitle, pMessage, NULL, &itemHit); }
static void DoAbout(void) // Displays the about box. { SInt16 junkHit; (void) StandardAlert( kAlertPlainAlert, "\pLoginItemsTestAE", "\pA simple program to test LoginItemsAE.\r\rDTS\r\r© 2005 Apple Computer, Inc.", NULL, &junkHit ); }
static int checkAppleVideoCard(void) { CGLRendererInfoObj rend; long theErr; unsigned long display_mask; long nrend; int j; long value; long maxvram = 0; /* we get always more than 1 renderer, check one, at least, has 8 Mo */ display_mask = CGDisplayIDToOpenGLDisplayMask (CGMainDisplayID() ); theErr = CGLQueryRendererInfo( display_mask, &rend, &nrend); if (theErr == 0) { theErr = CGLDescribeRenderer (rend, 0, kCGLRPRendererCount, &nrend); if (theErr == 0) { for (j = 0; j < nrend; j++) { theErr = CGLDescribeRenderer (rend, j, kCGLRPVideoMemory, &value); if (value > maxvram) maxvram = value; if ((theErr == 0) && (value >= 20000000)) { theErr = CGLDescribeRenderer (rend, j, kCGLRPAccelerated, &value); if ((theErr == 0) && (value != 0)) { theErr = CGLDescribeRenderer (rend, j, kCGLRPCompliant, &value); if ((theErr == 0) && (value != 0)) { /*fprintf(stderr,"make it big\n");*/ CGLDestroyRendererInfo (rend); macPrefState = 8; return 1; } } } } } } if (maxvram < 7500000 ) { /* put a standard alert and quit*/ SInt16 junkHit; char inError[] = "* Not enough VRAM "; char inText[] = "* blender needs at least 8Mb "; inError[0] = 16; inText[0] = 28; fprintf(stderr, " vram is %li . not enough, aborting\n", maxvram); StandardAlert ( kAlertStopAlert, (ConstStr255Param) &inError, (ConstStr255Param)&inText,NULL,&junkHit); abort(); } CGLDestroyRendererInfo (rend); return 0; }
int main(void) { OSStatus err; UInt32 response; err = Gestalt(gestaltSystemVersion, (long *) &response); if (err == noErr) { if ( response < 0x1020 ) { SInt16 junkHit; (void) StandardAlert( kAlertStopAlert, "\pLoginItemsAETest requires Mac OS X 10.2 or later.", "\p", NULL, &junkHit ); err = userCanceledErr; } } // Start up the UI. if (err == noErr) { err = SetupUserInterface(); } // Install our HICommand handler. if (err == noErr) { gApplicationEventHandlerUPP = NewEventHandlerUPP(ApplicationEventHandler); assert(gApplicationEventHandlerUPP != NULL); err = InstallApplicationEventHandler(gApplicationEventHandlerUPP, GetEventTypeCount(kApplicationEvents), kApplicationEvents, NULL, NULL); } // Run the application. if (err == noErr) { RunApplicationEventLoop(); } DisplayError(err); return 0; }
void Logger::error(const std::string &error_text) { log("Error: %s", error_text.c_str()); #ifdef WIN32 MessageBox(NULL, error_text.c_str(), "Error", MB_ICONERROR | MB_OK); #elif defined __APPLE__ Str255 msg; CFStringRef error; error = CFStringCreateWithCString(NULL, error_text.c_str(), kCFStringEncodingMacRoman); CFStringGetPascalString(error, msg, 255, kCFStringEncodingMacRoman); StandardAlert(kAlertStopAlert, "\pError", (ConstStr255Param) msg, NULL, NULL); #else std::cerr << "Error: " << error_text << std::endl; #endif exit(1); }
void ShowSecurityError(const char *format, ...) { va_list args; #ifdef __x86_64__ va_start(args, format); vfprintf(stderr, format, args); va_end(args); #else char s[1024]; short itemHit; AlertStdAlertParamRec alertParams; ModalFilterUPP ErrorDlgFilterProcUPP; ProcessSerialNumber ourProcess; va_start(args, format); s[0] = vsprintf(s+1, format, args); va_end(args); ErrorDlgFilterProcUPP = NewModalFilterUPP(ErrorDlgFilterProc); alertParams.movable = true; alertParams.helpButton = false; alertParams.filterProc = ErrorDlgFilterProcUPP; alertParams.defaultText = "\pOK"; alertParams.cancelText = NULL; alertParams.otherText = NULL; alertParams.defaultButton = kAlertStdAlertOKButton; alertParams.cancelButton = 0; alertParams.position = kWindowDefaultPosition; ::GetCurrentProcess (&ourProcess); ::SetFrontProcess(&ourProcess); StandardAlert (kAlertStopAlert, (StringPtr)s, NULL, &alertParams, &itemHit); DisposeModalFilterUPP(ErrorDlgFilterProcUPP); #endif }
int wxMessageDialog::ShowModal() { int resultbutton = wxID_CANCEL ; short result ; const long style = GetMessageDialogStyle(); wxASSERT_MSG( ( style & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ; AlertType alertType = kAlertPlainAlert ; if (style & wxICON_EXCLAMATION) alertType = kAlertNoteAlert ; else if (style & wxICON_HAND) alertType = kAlertStopAlert ; else if (style & wxICON_INFORMATION) alertType = kAlertNoteAlert ; else if (style & wxICON_QUESTION) alertType = kAlertCautionAlert ; #if TARGET_CARBON if ( UMAGetSystemVersion() >= 0x1000 ) { AlertStdCFStringAlertParamRec param ; wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ; wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ; wxMacCFStringHolder cfTitle(m_caption , m_font.GetEncoding()); wxMacCFStringHolder cfText(m_message , m_font.GetEncoding()); param.movable = true; param.flags = 0 ; bool skipDialog = false ; if (style & wxYES_NO) { if (style & wxCANCEL) { param.defaultText = cfYesString ; param.cancelText = (CFStringRef) kAlertDefaultCancelText; param.otherText = cfNoString ; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = kAlertStdAlertCancelButton; } else { param.defaultText = cfYesString ; param.cancelText = NULL; param.otherText = cfNoString ; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } } // the msw implementation even shows an ok button if it is not specified, we'll do the same else { if (style & wxCANCEL) { // thats a cancel missing param.defaultText = (CFStringRef) kAlertDefaultOKText ; param.cancelText = (CFStringRef) kAlertDefaultCancelText ; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } else { param.defaultText = (CFStringRef) kAlertDefaultOKText ; param.cancelText = NULL; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } } /* else { skipDialog = true ; } */ param.position = kWindowDefaultPosition; if ( !skipDialog ) { DialogRef alertRef ; CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ; RunStandardAlert( alertRef , NULL , &result ) ; } if ( skipDialog ) return wxID_CANCEL ; } else #endif { AlertStdAlertParamRec param; Str255 yesPString ; Str255 noPString ; Str255 pascalTitle ; Str255 pascalText ; wxMacStringToPascal( m_caption , pascalTitle ) ; wxMacStringToPascal( _("Yes") , yesPString ) ; wxMacStringToPascal( _("No") , noPString ) ; wxMacStringToPascal( m_message , pascalText ) ; param.movable = true; param.filterProc = NULL ; if (style & wxYES_NO) { if (style & wxCANCEL) { param.defaultText = yesPString ; param.cancelText = (StringPtr) kAlertDefaultCancelText; param.otherText = noPString ; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = kAlertStdAlertCancelButton; } else { param.defaultText = yesPString ; param.cancelText = NULL; param.otherText = noPString ; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } } else if (style & wxOK) { if (style & wxCANCEL) { param.defaultText = (StringPtr) kAlertDefaultOKText ; param.cancelText = (StringPtr) kAlertDefaultCancelText ; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } else { param.defaultText = (StringPtr) kAlertDefaultOKText ; param.cancelText = NULL; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = 0; } } else { return resultbutton ; } param.position = 0; StandardAlert( alertType, pascalTitle, pascalText, ¶m, &result ); } if (style & wxOK) { if (style & wxCANCEL) { //TODO add Cancelbutton switch( result ) { case 1 : resultbutton = wxID_OK ; break ; case 2 : break ; case 3 : break ; } } else { switch( result ) { case 1 : resultbutton = wxID_OK ; break ; case 2 : break ; case 3 : break ; } } } else if (style & wxYES_NO) { if (style & wxCANCEL) { switch( result ) { case 1 : resultbutton = wxID_YES ; break ; case 2 : resultbutton = wxID_CANCEL ; break ; case 3 : resultbutton = wxID_NO ; break ; } } else { switch( result ) { case 1 : resultbutton = wxID_YES ; break ; case 2 : break ; case 3 : resultbutton = wxID_NO ; break ; } } } return resultbutton ; }
void display_mac_alert(char *message, int error) { window *wind; d_event event; int fullscreen; bool osX = FALSE; uint response; int16_t itemHit; // Handle Descent's windows properly if ((wind = window_get_front())) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_DEACTIVATED); if (grd_curscreen && (fullscreen = gr_check_fullscreen())) gr_toggle_fullscreen(); osX = ( Gestalt(gestaltSystemVersion, (long *) &response) == noErr) && (response >= 0x01000 ); ShowCursor(); if (osX) { #ifdef TARGET_API_MAC_CARBON DialogRef alert; CFStringRef error_text = CFSTR("Sorry, a critical error has occurred."); CFStringRef text = NULL; text = CFStringCreateWithCString(CFAllocatorGetDefault(), message, kCFStringEncodingMacRoman); if (!text) { if (wind) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED); return; } if (CreateStandardAlert(error ? kAlertStopAlert : kAlertNoteAlert, error ? error_text : text, error ? text : NULL, 0, &alert) != noErr) { CFRelease(text); if (wind) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED); return; } RunStandardAlert(alert, 0, &itemHit); CFRelease(text); #endif } else { // This #if guard removes both compiler warnings // and complications if we didn't link the (older) Mac OS X SDK that actually supports the following. #if !defined(MAC_OS_X_VERSION_MAX_ALLOWED) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4) Str255 error_text = "\pSorry, a critical error has occurred."; Str255 text; CopyCStringToPascal(message, text); StandardAlert(error ? kAlertStopAlert : kAlertNoteAlert, error ? error_text : text, error ? text : NULL, 0, &itemHit); #endif } if ((wind = window_get_front())) WINDOW_SEND_EVENT(wind, EVENT_WINDOW_ACTIVATED); if (grd_curscreen && !error && fullscreen) gr_toggle_fullscreen(); }
int main(int argc, char *argv[]) { Boolean Success; ProcessSerialNumber ourProcess, installerPSN; short itemHit; long brandID = 0; int i; pid_t installerPID = 0, coreClientPID = 0, waitPermissionsPID = 0; FSRef fileRef; OSStatus err, err_fsref; FILE *f; char s[256]; char *q; #ifdef SANDBOX uid_t saved_euid, saved_uid, b_m_uid; passwd *pw; int finalInstallAction; DialogRef theWin; #else // SANDBOX group *grp; #endif // SANDBOX appName[0] = "/Applications/BOINCManager.app"; appNameEscaped[0] = "/Applications/BOINCManager.app"; brandName[0] = "BOINC"; saverName[0] = "BOINCSaver"; saverNameEscaped[0] = "BOINCSaver"; receiptNameEscaped[0] = "/Library/Receipts/BOINC.pkg"; appName[1] = "/Applications/GridRepublic Desktop.app"; appNameEscaped[1] = "/Applications/GridRepublic\\ Desktop.app"; brandName[1] = "GridRepublic"; saverName[1] = "GridRepublic"; saverNameEscaped[1] = "GridRepublic"; receiptNameEscaped[1] = "/Library/Receipts/GridRepublic.pkg"; appName[2] = "/Applications/Progress Thru Processors Desktop.app"; appNameEscaped[2] = "/Applications/Progress\\ Thru\\ Processors\\ Desktop.app"; brandName[2] = "Progress Thru Processors"; saverName[2] = "Progress Thru Processors"; saverNameEscaped[2] = "Progress\\ Thru\\ Processors"; receiptNameEscaped[2] = "/Library/Receipts/Progress\\ Thru\\ Processors.pkg"; ::GetCurrentProcess (&ourProcess); // getlogin() gives unreliable results under OS 10.6.2, so use environment strncpy(loginName, getenv("USER"), sizeof(loginName)-1); err = Gestalt(gestaltSystemVersion, &OSVersion); if (err != noErr) return err; for (i=0; i<argc; i++) { if (strcmp(argv[i], "-part2") == 0) return DeleteReceipt(); } Initialize(); QuitBOINCManager('BNC!'); // Quit any old instance of BOINC manager sleep(2); // Core Client may still be running if it was started without Manager coreClientPID = FindProcessPID("boinc", 0); if (coreClientPID) kill(coreClientPID, SIGTERM); // boinc catches SIGTERM & exits gracefully err = FindProcess ('APPL', 'xins', &installerPSN); if (err == noErr) err = GetProcessPID(&installerPSN , &installerPID); brandID = GetBrandID(); if ((brandID < 0) || (brandID >= NUMBRANDS)) { // Safety check brandID = 0; } if (OSVersion < 0x1040) { ::SetFrontProcess(&ourProcess); // Remove everything we've installed // "\pSorry, this version of GridRepublic requires system 10.4.0 or higher." s[0] = sprintf(s+1, "Sorry, this version of %s requires system 10.4.0 or higher.", brandName[brandID]); StandardAlert (kAlertStopAlert, (StringPtr)s, NULL, NULL, &itemHit); // "rm -rf /Applications/GridRepublic\\ Desktop.app" sprintf(s, "rm -rf %s", appNameEscaped[brandID]); system (s); // "rm -rf /Library/Screen\\ Savers/GridRepublic.saver" sprintf(s, "rm -rf /Library/Screen\\ Savers/%s.saver", saverNameEscaped[brandID]); system (s); // "rm -rf /Library/Receipts/GridRepublic.pkg" sprintf(s, "rm -rf %s", receiptNameEscaped[brandID]); system (s); // We don't customize BOINC Data directory name for branding system ("rm -rf /Library/Application\\ Support/BOINC\\ Data"); err = kill(installerPID, SIGKILL); ExitToShell(); } sleep (2); // Install all_projects_list.xml file, but only if one doesn't // already exist, since a pre-existing one is probably newer. f = fopen("/Library/Application Support/BOINC Data/all_projects_list.xml", "r"); if (f) { fclose(f); // Already exists } else { system ("cp -fp Contents/Resources/all_projects_list.xml /Library/Application\\ Support/BOINC\\ Data/"); system ("chmod a-x /Library/Application\\ Support/BOINC\\ Data/all_projects_list.xml"); } Success = false; #ifdef SANDBOX CheckUserAndGroupConflicts(); for (i=0; i<5; ++i) { err = CreateBOINCUsersAndGroups(); if (err != noErr) { // print_to_log_file("CreateBOINCUsersAndGroups returned %d (repetition=%d)", err, i); continue; } // err = SetBOINCAppOwnersGroupsAndPermissions("/Applications/GridRepublic Desktop.app"); err = SetBOINCAppOwnersGroupsAndPermissions(appName[brandID]); if (err != noErr) { // print_to_log_file("SetBOINCAppOwnersGroupsAndPermissions returned %d (repetition=%d)", err, i); continue; } err = SetBOINCDataOwnersGroupsAndPermissions(); if (err != noErr) { // print_to_log_file("SetBOINCDataOwnersGroupsAndPermissions returned %d (repetition=%d)", err, i); continue; } err = check_security(appName[brandID], "/Library/Application Support/BOINC Data", true, false); if (err == noErr) break; // print_to_log_file("check_security returned %d (repetition=%d)", err, i); } #else // ! defined(SANDBOX) // The BOINC Manager and Core Client have the set-user-ID-on-execution // flag set, so their ownership is important and must match the // ownership of the BOINC Data directory. // Find an appropriate admin user to set as owner of installed files // First, try the user currently logged in grp = getgrnam("admin"); i = 0; while ((p = grp->gr_mem[i]) != NULL) { // Step through all users in group admin if (strcmp(p, loginName) == 0) { Success = true; // Logged in user is a member of group admin break; } ++i; } // If currently logged in user is not admin, use first non-root admin user if (!Success) { i = 0; while ((p = grp->gr_mem[i]) != NULL) { // Step through all users in group admin if (strcmp(p, "root") != 0) break; ++i; } } // Set owner of branded BOINCManager and contents, including core client // "chown -Rf username /Applications/GridRepublic\\ Desktop.app" sprintf(s, "chown -Rf %s %s", p, appNameEscaped[brandID]); system (s); // Set owner of BOINC Screen Saver // "chown -Rf username /Library/Screen\\ Savers/GridRepublic.saver" sprintf(s, "chown -Rf %s /Library/Screen\\ Savers/%s.saver", p, saverNameEscaped[brandID]); system (s); // We don't customize BOINC Data directory name for branding // "chown -Rf username /Library/Application\\ Support/BOINC\\ Data" sprintf(s, "chown -Rf %s /Library/Application\\ Support/BOINC\\ Data", p); system (s); // "chmod -R a+s /Applications/GridRepublic\\ Desktop.app" sprintf(s, "chmod -R a+s %s", appNameEscaped[brandID]); system (s); #endif // ! defined(SANDBOX) // Remove any branded versions of BOINC other than ours (i.e., old versions) for (i=0; i< NUMBRANDS; i++) { if (i == brandID) continue; // "rm -rf /Applications/GridRepublic\\ Desktop.app" sprintf(s, "rm -rf %s", appNameEscaped[i]); system (s); // "rm -rf /Library/Screen\\ Savers/GridRepublic.saver" sprintf(s, "rm -rf /Library/Screen\\ Savers/%s.saver", saverNameEscaped[i]); system (s); } if (brandID == 0) { // Installing generic BOINC system ("rm -f /Library/Application\\ Support/BOINC\\ Data/Branding"); } // err_fsref = FSPathMakeRef((StringPtr)"/Applications/GridRepublic Desktop.app", &fileRef, NULL); err_fsref = FSPathMakeRef((StringPtr)appName[brandID], &fileRef, NULL); if (err_fsref == noErr) err = LSRegisterFSRef(&fileRef, true); err = UpdateAllVisibleUsers(brandID); if (err != noErr) return err; #ifdef SANDBOX err = CheckLogoutRequirement(&finalInstallAction); if (finalInstallAction == launchWhenDone) { // Wait for BOINC's RPC socket address to become available to user boinc_master, in // case we are upgrading from a version which did not run as user boinc_master. saved_uid = getuid(); saved_euid = geteuid(); pw = getpwnam("boinc_master"); b_m_uid = pw->pw_uid; seteuid(b_m_uid); for (i=0; i<120; i++) { err = TestRPCBind(); if (err == noErr) break; sleep(1); } seteuid(saved_euid); ProcessSerialNumber ourPSN; ProcessInfoRec pInfo; FSRef ourFSRef, theFSRef; char thePath[MAXPATHLEN]; // Get the full path to this PostInstall application's bundle err = GetCurrentProcess (&ourPSN); if (err) return -1000; // Should never happen memset(&pInfo, 0, sizeof(pInfo)); pInfo.processInfoLength = sizeof( ProcessInfoRec ); err = GetProcessInformation(&ourPSN, &pInfo); if (err) return -1001; // Should never happen err = GetProcessBundleLocation(&ourPSN, &ourFSRef); if (err) return -1002; // Should never happen err = FSRefMakePath (&ourFSRef, (UInt8*)thePath, sizeof(thePath)); if (err) return -1003; // Should never happen q = strrchr(thePath, '/'); if (q == NULL) return -1004; // Should never happen *++q = '\0'; strlcat(thePath, "WaitPermissions.app", sizeof(thePath)); err = FSPathMakeRef((StringPtr)thePath, &theFSRef, NULL); // When we first create the boinc_master group and add the current user to the // new group, there is a delay before the new group membership is recognized. // If we launch the BOINC Manager too soon, it will fail with a -1037 permissions // error, so we wait until the current user can access the switcher application. // Apparently, in order to get the changed permissions / group membership, we must // launch a new process belonging to the user. It may also need to be in a new // process group or new session. Neither system() nor popen() works, even after // setting the uid and euid back to the logged in user, but LSOpenFSRef() does. // The WaitPermissions application loops until it can access the switcher // application. err = LSOpenFSRef(&theFSRef, NULL); waitPermissionsStartTime = time(NULL); for (i=0; i<15; i++) { // Show "Please wait..." alert after 15 seconds waitPermissionsPID = FindProcessPID("WaitPermissions", 0); if (waitPermissionsPID == 0) { return 0; } sleep(1); } CreateStandardAlert(kAlertNoteAlert, CFSTR("Finishing install. Please wait ..."), CFSTR("This may take a few more minutes."), NULL, &theWin); HideDialogItem(theWin, kStdOkItemIndex); RemoveDialogItems(theWin, kStdOkItemIndex, 1, false); RunStandardAlert(theWin, &myFilterProc, &itemHit); } #endif // SANDBOX return 0; }
boolean notifyuser (bigstring bsmessage) { /* use the Notification Manager to ask the user to bring our app to the front. note that we must allocate the record in the heap because multi-threading makes stack addresses non-persistent. 1/18/93 dmb: langbackgroundtask now takes flresting parameter; don't set global 6/9/93 dmb: don't ignore the result of the background callbacks 2.1b5 dmb: if we're in the main thread, need to do same as if yield is disabled. 7.0d6 PBS: In Pike, the header of the dialog should not read UserLand Frontier, it should be UserLand [Whatever]. At this writing, [Whatever] is still undefined, so we'll go with Whatever for the moment. */ #ifdef MACVERSION NMRecPtr pb; tyiconfamily icons; OSErr errcode; boolean fl = true; #define systemevents (osMask | updateMask | activMask | highLevelEventMask) #if TARGET_API_MAC_CARBON == 1 { SInt16 itemhit = 0; OSErr err = noErr; err = StandardAlert (kAlertNoteAlert, bsmessage, nil, nil, &itemhit); return (err == noErr); } #endif pb = (NMRecPtr) NewPtrClear (longsizeof (NMRec)); if (pb == nil) return (false); /* clearbytes (&pb, longsizeof (pb)); */ (*pb).qType = nmType; (*pb).nmMark = 1; clearbytes (&icons, longsizeof (icons)); icons.hics1 = GetResource ('ics#', 128); icons.hics4 = GetResource ('ics4', 128); icons.hics8 = GetResource ('ics8', 128); newfilledhandle (&icons, longsizeof (tyiconfamily), &(*pb).nmIcon); (*pb).nmSound = (Handle) -1; if (isemptystring (bsmessage)) (*pb).nmStr = nil; else { (*pb).nmStr = (StringPtr) NewPtr (stringsize (bsmessage)); copystring (bsmessage, (*pb).nmStr); } (*pb).nmResp = nil; errcode = NMInstall (pb); if (errcode == noErr) { while (!shellisactive ()) { if (flscriptrunning) { if (fldisableyield || inmainthread ()) fl = langpartialeventloop (systemevents); else fl = langbackgroundtask (true); /*let main thread field events*/ } else fl = shellpartialeventloop (systemevents); if (!fl) break; } NMRemove (pb); } disposehandle ((*pb).nmIcon); if ((*pb).nmStr != nil) DisposePtr ((Ptr) (*pb).nmStr); DisposePtr ((Ptr) pb); return (fl && (errcode == noErr)); #endif #ifdef WIN95VERSION char s [256]; short itemnumber; copyptocstring (bsmessage, s); releasethreadglobals (); //#ifdef PIKE // // /*7.0d8 PBS: name change to Radio UserLand*/ // // itemnumber = MessageBox (hwndMDIClient, s, "Radio UserLand", MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); // //#else /* 9.1b3 JES: APPNAME macro is defined in versions.h for both Radio and Frontier -- use instead of hard-coded string */ itemnumber = MessageBox (hwndMDIClient, s, APPNAME, MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); //#endif grabthreadglobals (); return (itemnumber == IDOK); #endif } /*notifyuser*/