cfcgf@ux1.cts.eiu.edu (Chuck Fleming) (04/16/91)
I'm trying to start up and communicate (via Speaker/Listener) with a NextStep application on a remote machine. When I manually launch the app on the remote machine, everything works fine. NXPortFromName does its job and so I can get a handle on the remote app. The problem is that I don't know how to start up the application on the remote machine (from within a NextStep application - which is where I want to do it - on the local machine ) other than executing system("rsh reis26 -l cfleming MyListener -NXHost reis27 &") from the local machine. This works, but the display (the main window) appears on the local machine. I had hoped system("rsh reis26 MyListener &") would have worked. Is there a problem with this second attempt because MyListener displays a window on the screen? Is this a problem since neither Workspace.app or Workspace Helper are running on the remote machine? I guess the basic question is: How can one start up a NextStep application on a remote machine (on which I have an account)? I have set both machines to be public window servers. For some reason I have to reset the preference (public window server) every time I run the apps. The selection doesn't seem to remain even though the check box is checked. Thanks, chuck fleming cfcgf@eiu.edu ps. Here's a bit of the code if it might help. #import "SpeakerWindow.h" #import "MyMessageSpeaker.h" #import <appkit/Speaker.h> #import <appkit/Listener.h> #import <appkit/Panel.h> #import <appkit/Application.h> #import <appkit/TextField.h> #import <strings.h> #import <stdlib.h> @implementation SpeakerWindow // Set up the application's speaker. - initContent:(const NXRect*)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag { MyMessageSpeaker *aSpeaker; self = [super initContent:contentRect style:aStyle backing:bufferingType buttonMask:mask defer:flag]; aSpeaker = [[MyMessageSpeaker alloc] init]; [NXApp setAppSpeaker:aSpeaker]; //************************************************************************ // This seems to enable NXPortFromName (in sendText:) to work. But I don't // really want to see the output displayed on the local machine. // Start the application on the remote machine. Put it in the background // so that we regain control. No password is needed since we have fixed // /etc/hosts.equiv on reis26. system("rsh reis26 -l cfleming MyListener -NXHost reis27 &"); //************************************************************************ //************************************************************************ // I would like to use something like this. But it doesn't work. //system("rsh reis26 MyListener &"); //************************************************************************ return self; } // This method will attempt to send the message "setMyText::" to a remote // application. - sendText:sender { int speakerResult, stringLength, anInteger; char *word; port_t remoteAppPort; // Get send rights to the port registered under the name "MyListener". // Use NULL as the second argument if you want the local host. remoteAppPort = NXPortFromName("MyListener", "reis26"); if (remoteAppPort != PORT_NULL) { // This should be done before each remote message is sent, because // the workspace manager may reset the appSpeaker behind your back. [[NXApp appSpeaker] setSendPort:remoteAppPort]; // Send the message to MyListener. stringLength = strlen([wordField stringValue]); word = malloc(stringLength+1); strcpy(word,[wordField stringValue]); speakerResult = [[NXApp appSpeaker] setMyText:word returnValue:&anInteger]; free(word); // See if the remote application can handle the message. If it // can, it should send back the number of characters in the word // sent to it. Put this result in the length field. if (speakerResult == 0) [lengthField setIntValue:anInteger]; else NXRunAlertPanel("Error", "MyListener could not handle the message.", NULL, NULL, NULL); } else NXRunAlertPanel("Error","MyListener's port could not be found.", NULL, NULL, NULL); return self; } @end