- if ( pFrame != NULL )
- pFrame->SetStatusText(szString);
- }
- break;
-
- case wxLOG_Trace:
- case wxLOG_Debug:
- #ifdef __WXDEBUG__
- {
- wxString strTime = TimeStamp();
-
- #ifdef __WXMSW__
- // don't prepend debug/trace here: it goes to the debug window
- // anyhow, but do put a timestamp
- OutputDebugString(strTime + szString + "\n\r");
- #else
- // send them to stderr
- fprintf(stderr, "%s %s: %s\n",
- strTime.c_str(),
- level == wxLOG_Trace ? "Trace" : "Debug",
- szString);
- fflush(stderr);
- #endif
- }
- #endif // __WXDEBUG__
- break;
-
- case wxLOG_FatalError:
- // show this one immediately
- wxMessageBox(szString, _("Fatal error"), wxICON_HAND);
- break;
-
- case wxLOG_Error:
- case wxLOG_Warning:
- // discard earlier informational messages if this is the 1st error
- if ( !m_bErrors ) {
- m_aMessages.Empty();
- m_bHasMessages = TRUE;
- m_bErrors = TRUE;
- }
-
- m_aMessages.Add(szString);
- break;
-
- default:
- wxFAIL_MSG(_("unknown log level in wxLogGui::DoLog"));
- }
+static MetroNubUserEntryBlock* gMetroNubEntry = NULL;
+
+static long fRunOnce = false;
+
+Boolean IsCompatibleVersion(short inVersion);
+
+/* ---------------------------------------------------------------------------
+ IsCompatibleVersion
+ --------------------------------------------------------------------------- */
+
+Boolean IsCompatibleVersion(short inVersion)
+{
+ Boolean result = false;
+
+ if (fRunOnce)
+ {
+ MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
+
+ result = (inVersion <= block->apiHiVersion);
+ }
+
+ return result;
+}
+
+/* ---------------------------------------------------------------------------
+ IsMetroNubInstalled
+ --------------------------------------------------------------------------- */
+
+Boolean IsMetroNubInstalled()
+{
+ if (!fRunOnce)
+ {
+ long result, value;
+
+ fRunOnce = true;
+ gMetroNubEntry = NULL;
+
+ if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000)
+ {
+ /* look for MetroNub's Gestalt selector */
+ if (Gestalt(kMetroNubUserSignature, &result) == noErr)
+ {
+
+ #if TARGET_API_MAC_CARBON
+ if (gCallUniversalProc_Proc == NULL)
+ {
+ CFragConnectionID connectionID;
+ Ptr mainAddress;
+ Str255 errorString;
+ ProcPtr symbolAddress;
+ OSErr err;
+ CFragSymbolClass symbolClass;
+
+ symbolAddress = NULL;
+ err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
+ &connectionID, &mainAddress, errorString);
+
+ if (err != noErr)
+ {
+ gCallUniversalProc_Proc = NULL;
+ goto end;
+ }
+
+ err = FindSymbol(connectionID, "\pCallUniversalProc",
+ (Ptr *) &gCallUniversalProc_Proc, &symbolClass);
+
+ if (err != noErr)
+ {
+ gCallUniversalProc_Proc = NULL;
+ goto end;
+ }
+ }
+ #endif
+
+ {
+ MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
+
+ /* make sure the version of the API is compatible */
+ if (block->apiLowVersion <= kMetroNubUserAPIVersion &&
+ kMetroNubUserAPIVersion <= block->apiHiVersion)
+ gMetroNubEntry = block; /* success! */
+ }
+
+ }
+ }
+ }
+
+end:
+
+#if TARGET_API_MAC_CARBON
+ return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL);
+#else
+ return (gMetroNubEntry != NULL);
+#endif