extern CFDataRef GPDuplexClient_Send(GPDuplexClientRef client, SInt32 type, CFDataRef data, Boolean expectsReturn) { CFMessagePortRef serverPort; if (client != NULL) serverPort = client->serverPort; else { serverPort = CFMessagePortCreateRemote(NULL, CFSTR("hk.kennytm.GriP.server")); if (serverPort == NULL) { CFShow(CFSTR("GPDuplexClient_Send(): Cannot create server port. Is GriP running?")); return NULL; } } if (expectsReturn) { CFDataRef retData = NULL; SInt32 errorCode = CFMessagePortSendRequest(serverPort, type, data, 4, 1, kCFRunLoopDefaultMode, &retData); if (client == NULL) CFRelease(serverPort); if (errorCode != kCFMessagePortSuccess) { CFLog(4, CFSTR("GPDuplexClient_Send(): Cannot send data %@ of type %d to server. Returning NULL. Error code = %d"), data, type, errorCode); if (retData != NULL) { CFRelease(retData); retData = NULL; } } return retData; } else { SInt32 errorCode = CFMessagePortSendRequest(serverPort, type, data, 4, 0, NULL, NULL); if (client == NULL) CFRelease(serverPort); if (errorCode != kCFMessagePortSuccess) { CFLog(4, CFSTR("GPDuplexClient_Send(): Cannot send data %@ of type %d to server. Error code = %d"), data, type, errorCode); } return NULL; } }
static void mach_reply_func(struct ReplyAddress * addr, char* msg, int size) { CFMessagePortRef replyPort = (CFMessagePortRef) addr->mSocket; CFDataRef data = CFDataCreateWithBytesNoCopy(NULL, (const UInt8*)msg, size, kCFAllocatorNull); CFMessagePortSendRequest(replyPort, 0, data, 0, 0, NULL, NULL); CFRelease(data); }
void Zirk2PortClient::SendConnect() { if (!mRemoteMessagePort) return; CFDataRef returnData; SInt32 ans = CFMessagePortSendRequest(GetRemoteMessagePort(), kZirkPort_Connect, mData, 1., 1., NULL, &returnData); if (ans != 0) return; }
static OSStatus BIMSendMessageToUIServer( BasicMessageID inMessageID ) { OSStatus result; CFDataRef sendData; CFDataRef replyData; CFMessagePortRef serverPortRef; BasicMessageHeader header; result = noErr; sendData = NULL; replyData = NULL; serverPortRef = NULL; // Create a reference to the remote message port. We identify the port using a unique, // system-wide name, in this case defined by kBasicServerPortName. serverPortRef = CFMessagePortCreateRemote( NULL, CFSTR( kBasicServerPortName ) ); if( serverPortRef == NULL ) result = -1; // Create our message header. if( result == noErr ) result = GetCurrentProcess( &header.fProcessSerialNumber ); if( result == noErr ) { sendData = CFDataCreate( NULL, (UInt8 *) &header, sizeof( BasicMessageHeader ) ); if (sendData == NULL) result = memFullErr; } // Send the message specified in iMessageID to the server. We send the message header // as data. if( result == noErr ) { if( CFMessagePortSendRequest( serverPortRef, inMessageID, sendData, 10, 10, NULL, &replyData ) != kCFMessagePortSuccess ) result = -2; } // Release everything. if( sendData ) CFRelease( sendData ); if( replyData ) CFRelease( replyData ); if( serverPortRef ) CFRelease( serverPortRef ); // Return an error code to the caller. return result; }
extern GPDuplexClientRef GPDuplexClient_Create() { CFRunLoopRef runLoop = CFRunLoopGetCurrent(); GPDuplexClientRef client = calloc(1, sizeof(GPDuplexClientRef)); client->refcount = 1; client->observers = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // (1) Obtain the server port. client->serverPort = CFMessagePortCreateRemote(NULL, CFSTR("hk.kennytm.GriP.server")); if (client->serverPort == NULL) { CFShow(CFSTR("GPDuplexClient_Init(): Cannot create server port. Is GriP running?")); GPDuplexClient_Release(client); return NULL; } // (2) ask the server port for a unique ID. CFDataRef pidData = NULL; SInt32 errorCode = CFMessagePortSendRequest(client->serverPort, GPMessage_GetClientPortID, NULL, 1, 1, kCFRunLoopDefaultMode, &pidData); if (errorCode != kCFMessagePortSuccess || pidData == NULL) { CFLog(4, CFSTR("GPDuplexClient_Init(): Cannot obtain a unique client port ID from server. Error code = %d and pidData = %@."), errorCode, pidData); if (pidData != NULL) CFRelease(pidData); GPDuplexClient_Release(client); return NULL; } // (3) Create client port from UID. const char* clientPortCString = (const char*)CFDataGetBytePtr(pidData); CFStringRef clientPortName = CFStringCreateWithCString(NULL, clientPortCString, kCFStringEncodingUTF8); CFMessagePortContext clientContext = {0, client, NULL, NULL, NULL}; Boolean shouldFreeInfo = false; client->clientPort = CFMessagePortCreateLocal(NULL, clientPortName, &GPClientCallback, &clientContext, &shouldFreeInfo); if (shouldFreeInfo || client->clientPort == NULL) { CFLog(4, CFSTR("GPDuplexClient_Init(): Cannot create client port with port name %@."), clientPortName); CFRelease(clientPortName); CFRelease(pidData); GPDuplexClient_Release(client); return NULL; } CFRelease(clientPortName); // (4) Add client port to run loop. client->clientSource = CFMessagePortCreateRunLoopSource(NULL, client->clientPort, 0); CFRunLoopAddSource(runLoop, client->clientSource, kCFRunLoopDefaultMode); CFRelease(pidData); CFLog(4, CFSTR("create client = %@"), client->clientPort); return client; }
/* * Call from CoreMIDI IO threaded callback, * we can't call Wine debug channels, critical section or anything using NtCurrentTeb here. */ void MIDIIn_SendMessage(MIDIMessage msg) { CFDataRef data; CFMessagePortRef messagePort; messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MIDIInThreadPortName); data = CFDataCreate(kCFAllocatorDefault, (UInt8 *) &msg, sizeof(msg)); if (data) { CFMessagePortSendRequest(messagePort, 0, data, 0.0, 0.0, NULL, NULL); CFRelease(data); CFRelease(messagePort); } }
void Zirk2PortClient::SendPan(UInt32 channel, Float32 azimuth, Float32 zenith, Float32 azimuthSpan, Float32 zenithSpan, Float32 gain) { if (!mRemoteMessagePort) return; ClearData(); CFDataAppendBytes(mData, (const UInt8*) &channel, sizeof(channel)); CFDataAppendBytes(mData, (const UInt8*) &azimuth, sizeof(azimuth)); CFDataAppendBytes(mData, (const UInt8*) &zenith, sizeof(zenith)); CFDataAppendBytes(mData, (const UInt8*) &azimuthSpan, sizeof(azimuthSpan)); CFDataAppendBytes(mData, (const UInt8*) &zenithSpan, sizeof(zenithSpan)); CFDataAppendBytes(mData, (const UInt8*) &gain, sizeof(gain)); CFDataRef returnData; SInt32 ans = CFMessagePortSendRequest(GetRemoteMessagePort(), kZirkPort_Pan, mData, 1., 1., NULL, &returnData); if (ans != 0) return; }
static int SBA_sendMessage(UInt8 cmd, UInt16 dataLen, UInt8 *data, CFDataRef *resultData){ SBA_refresh(); // well, won't work if (!springBoardAccessMessagePort) { return kCFMessagePortIsInvalid; } // create and send message CFDataRef cfData = CFDataCreate(NULL, data, dataLen); CFStringRef replyMode = NULL; if (resultData) { replyMode = kCFRunLoopDefaultMode; } int result = CFMessagePortSendRequest(springBoardAccessMessagePort, cmd, cfData, 1, 1, replyMode, resultData); CFRelease(cfData); return result; }
static void target_send(CFMessagePortRef port, CFMutableStringRef inputstr) { CFDataRef inputData = CFStringCreateExternalRepresentation(NULL, inputstr, kCFStringEncodingUTF8, 0); CFDataRef returnedData; SInt32 code = CFMessagePortSendRequest(port, 0, inputData, 2, recvTimeout, kCFRunLoopDefaultMode, &returnedData); CFRelease(inputData); if (code != kCFMessagePortSuccess) { const char* errstr = "unknown error"; switch (code) { case kCFMessagePortSendTimeout: errstr = "send timeout"; break; case kCFMessagePortReceiveTimeout: errstr = "receive timeout"; break; case kCFMessagePortIsInvalid: errstr = "dunno something went wrong"; break; case kCFMessagePortTransportError: errstr = "error occurred while sending"; break; case kCFMessagePortBecameInvalidError: errstr = "osx is suddenly broken"; break; } fprintf(stderr, "error: %s\n", errstr); exit(2); } // CFStringRef responseString = CFStringCreateFromExternalRepresentation(NULL, returnedData, kCFStringEncodingUTF8); // CFRelease(returnedData); // CFIndex maxSize = CFStringGetMaximumSizeForEncoding(CFStringGetLength(responseString), kCFStringEncodingUTF8) + 1; // const char* responseCStringPtr = CFStringGetCStringPtr(responseString, kCFStringEncodingUTF8); // char responseCString[maxSize]; // // if (!responseCStringPtr) // CFStringGetCString(responseString, responseCString, maxSize, kCFStringEncodingUTF8); // printf("%s%s%s\n", COLOR_OUTPUT, responseCStringPtr ? responseCStringPtr : responseCString, COLOR_RESET); // // CFRelease(responseString); CFIndex maxSize = CFDataGetLength(returnedData) ; char responseCString[maxSize] ; CFDataGetBytes(returnedData, CFRangeMake(0,maxSize), (UInt8 *)responseCString ); printf("%s", COLOR_OUTPUT) ; fwrite(responseCString, 1, maxSize, stdout); printf("%s", COLOR_RESET) ; }
LONG CoreAudio_MIDIRelease(void) { TRACE("\n"); if (MIDIIn_NumDevs > 0) { CFMessagePortRef messagePort; /* Stop CFRunLoop in MIDIIn_MessageThread */ messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MIDIInThreadPortName); CFMessagePortSendRequest(messagePort, 1, NULL, 0.0, 0.0, NULL, NULL); CFRelease(messagePort); DeleteCriticalSection(&midiInLock); } if (wineMIDIClient) MIDIClientDispose(wineMIDIClient); /* MIDIClientDispose will close all ports */ HeapFree(GetProcessHeap(), 0, sources); HeapFree(GetProcessHeap(), 0, destinations); return DRV_SUCCESS; }