1// SMRemoteTargetApp.cpp
2
3#include <assert.h>
4#include <stdio.h>
5#include <string.h>
6
7#include <OS.h>
8
9#include "SMRemoteTargetApp.h"
10#include "SMLooper.h"
11
12// debugging
13//#define DBG(x) x
14#define DBG(x)
15#define OUT	printf
16
17int
18main(int argc, char **argv)
19{
20DBG(OUT("REMOTE: main()\n"));
21	assert(argc > 1);
22	const char *portName = argv[1];
23	bool preferred = (argc > 2 && !strcmp(argv[2], "preferred"));
24	// create local port
25	port_id localPort = create_port(5, "SMRemoteTargetApp port");
26	assert(localPort >= 0);
27DBG(OUT("REMOTE: local port created\n"));
28	// create looper/handler
29	SMHandler *handler = NULL;
30	SMLooper *looper = new SMLooper;
31	looper->Run();
32	if (!preferred) {
33		handler = new SMHandler;
34		assert(looper->Lock());
35		looper->AddHandler(handler);
36		looper->Unlock();
37	}
38DBG(OUT("REMOTE: looper/handler created\n"));
39	// find remote port
40DBG(OUT("REMOTE: find remote port `%s'\n", portName));
41	port_id remotePort = find_port(portName);
42	assert(remotePort >= 0);
43DBG(OUT("REMOTE: found remote port\n"));
44	// send init message
45	smrt_init initData;
46	initData.port = localPort;
47	initData.messenger = BMessenger(handler, looper);
48	assert(write_port(remotePort, SMRT_INIT, &initData, sizeof(smrt_init))
49		   == B_OK);
50DBG(OUT("REMOTE: init message sent\n"));
51	// loop until quit message
52	bool running = true;
53	while (running) {
54		char buffer[sizeof(smrt_get_ready)];
55		int32 code;
56		ssize_t readSize = read_port(localPort, &code, buffer, sizeof(buffer));
57		if (readSize < 0)
58			running = readSize;
59DBG(OUT("REMOTE: read port: %.4s\n", (char*)&code));
60		switch (code) {
61			case SMRT_GET_READY:
62			{
63DBG(OUT("REMOTE: SMRT_GET_READY\n"));
64				assert(readSize == sizeof(smrt_get_ready));
65				smrt_get_ready &data = *(smrt_get_ready*)buffer;
66				looper->SetReplyDelay(data.reply_delay);
67				looper->BlockUntil(data.unblock_time);
68DBG(OUT("REMOTE: SMRT_GET_READY done\n"));
69				break;
70			}
71			case SMRT_DELIVERY_SUCCESS_REQUEST:
72			{
73DBG(OUT("REMOTE: SMRT_DELIVERY_SUCCESS_REQUEST\n"));
74				assert(readSize == 0);
75				smrt_delivery_success data;
76				data.success = looper->DeliverySuccess();
77				assert(write_port(remotePort, SMRT_DELIVERY_SUCCESS_REPLY,
78								  &data, sizeof(smrt_delivery_success))
79					   == B_OK);
80DBG(OUT("REMOTE: SMRT_DELIVERY_SUCCESS_REQUEST done\n"));
81				break;
82			}
83			case SMRT_QUIT:
84DBG(OUT("REMOTE: QUIT\n"));
85			default:
86if (code != SMRT_QUIT)
87DBG(OUT("REMOTE: UNKNOWN COMMAND!\n"));
88				running = false;
89				break;
90		}
91	}
92	// delete looper/handler
93	if (looper) {
94		looper->Lock();
95		if (handler) {
96			looper->RemoveHandler(handler);
97			delete handler;
98		}
99		looper->Quit();
100	}
101DBG(OUT("REMOTE: looper/handler deleted\n"));
102	// delete local port
103	delete_port(localPort);
104DBG(OUT("REMOTE: main() done\n"));
105	return 0;
106}
107
108
109