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