1/*
2 * Copyright 2001-2015, Haiku, Inc.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		DarkWyrm <bpmagic@columbus.rr.com>
7 *		Axel D��rfler, axeld@pinc-software.de
8 *		Stephan A��mus <superstippi@gmx.de>
9 * 		Christian Packmann
10 *		Julian Harnath <julian.harnath@rwth-aachen.de>
11 */
12#include "TestServerLoopAdapter.h"
13
14#include "Desktop.h"
15#include "ServerConfig.h"
16#include "ServerProtocol.h"
17
18#include <PortLink.h>
19
20#include <stdio.h>
21
22//#define DEBUG_SERVER
23#ifdef DEBUG_SERVER
24#	include <stdio.h>
25#	define STRACE(x) printf x
26#else
27#	define STRACE(x) ;
28#endif
29
30
31TestServerLoopAdapter::TestServerLoopAdapter(const char* signature,
32	const char*, port_id, bool, status_t* outError)
33	:
34	MessageLooper("test-app_server"),
35	fMessagePort(_CreatePort())
36{
37	fLink.SetReceiverPort(fMessagePort);
38	*outError = B_OK;
39}
40
41
42TestServerLoopAdapter::~TestServerLoopAdapter()
43{
44}
45
46
47status_t
48TestServerLoopAdapter::Run()
49{
50 	rename_thread(find_thread(NULL), "picasso");
51	_message_thread((void*)this);
52	return B_OK;
53}
54
55
56void
57TestServerLoopAdapter::_DispatchMessage(int32 code,
58	BPrivate::LinkReceiver& link)
59{
60	switch (code) {
61		case AS_GET_DESKTOP:
62		{
63			port_id replyPort = 0;
64			link.Read<port_id>(&replyPort);
65
66			int32 userID = -1;
67			link.Read<int32>(&userID);
68
69			char* targetScreen = NULL;
70			link.ReadString(&targetScreen);
71
72			int32 version = -1;
73			link.Read<int32>(&version);
74
75 			BMessage message(AS_GET_DESKTOP);
76			message.AddInt32("user", userID);
77			message.AddInt32("version", version);
78			message.AddString("target", targetScreen);
79 			MessageReceived(&message);
80
81 			// AppServer will try to send a reply, we just let that fail
82 			// since we can find out the port by getting the desktop instance
83 			// ourselves
84
85			Desktop* desktop = _FindDesktop(userID, targetScreen);
86			free(targetScreen);
87
88			BPrivate::LinkSender reply(replyPort);
89			if (desktop != NULL) {
90				reply.StartMessage(B_OK);
91				reply.Attach<port_id>(desktop->MessagePort());
92			} else
93			reply.StartMessage(B_ERROR);
94
95			reply.Flush();
96
97			break;
98		}
99
100		case B_QUIT_REQUESTED:
101		{
102			QuitRequested();
103			break;
104		}
105
106		default:
107			STRACE(("Server::MainLoop received unexpected code %" B_PRId32 " "
108				"(offset %" B_PRId32 ")\n", code, code - SERVER_TRUE));
109			break;
110	}
111}
112
113
114port_id
115TestServerLoopAdapter::_CreatePort()
116{
117	port_id port = create_port(DEFAULT_MONITOR_PORT_SIZE, SERVER_PORT_NAME);
118	if (port < B_OK)
119		debugger("test-app_server could not create message port");
120	return port;
121}
122