#include extern "C" { #include #include #include } #include #include "mach_inject.h" #include "SCPatchClient.h" #ifdef __MWERKS__ #pragma export on #endif //------------------------------------------------------------------------------------------------------------- mach_error_t SCPatchInit( SCPatchParams *params ) { ProcessSerialNumber psn; mach_error_t err = err_none; SCPatchClient *client = SCPatchClient::GetPatchClientPointer(); if(client == NULL) { fprintf(stderr, "SCPc: sGlobalPatchClientInstance is not set!\n"); return err_sub(EFAULT); } client->mPatchParams = *params; client->mClientBundleID = CFStringCreateWithCharacters(NULL, params->patchBundleID.unicode, params->patchBundleID.length); client->mControllerBundleID = CFStringCreateWithCharacters(NULL, client->mPatchParams.parentBundleID.unicode, client->mPatchParams.parentBundleID.length); // Just in case if(client->mClientBundleID == NULL || client->mControllerBundleID == NULL) return err_sub(ENOMEM); if(client->Initialize(client->mClientBundleID, client->mControllerBundleID, getpid()) != noErr) return err_threadEntry_init_failed; // Create a port to receive messages from our patch controller if((err = client->StartListening(client->mClientBundleID, true, true)) != noErr) return err_threadEntry_init_failed; if((err = GetCurrentProcess(&psn)) != noErr || (err = client->SendMessage(client->mControllerBundleID, NULL, kSCMessageClass, kSCPatchSuccess, "bndl: TEXT(@), proc: psn (@)", CFStringGetCStringPtr(client->mClientBundleID, kCFStringEncodingMacRoman), sizeof(ProcessSerialNumber), &psn)) != noErr) return err_threadEntry_init_failed; return noErr; } #ifdef __MWERKS__ #pragma export off #endif //------------------------------------------------------------------------------------------------------------- SCPatchClient::SCPatchClient(void) { } //------------------------------------------------------------------------------------------------------------- SCPatchClient::~SCPatchClient(void) { }