diff --git a/headers/private/app/RegistrarDefs.h b/headers/private/app/RegistrarDefs.h index 736edbf361..e58216951b 100644 --- a/headers/private/app/RegistrarDefs.h +++ b/headers/private/app/RegistrarDefs.h @@ -23,7 +23,14 @@ namespace BPrivate { extern const char* kRAppLooperPortName; -#define B_REGISTRAR_SIGNATURE "application/x-vnd.haiku-registrar" +#ifndef HAIKU_TARGET_PLATFORM_LIBBE_TEST +# define B_REGISTRAR_SIGNATURE "application/x-vnd.haiku-registrar" +# define B_REGISTRAR_PORT_NAME "system:roster" +#else +# define B_REGISTRAR_SIGNATURE "application/x-vnd.test-registrar" +# define B_REGISTRAR_PORT_NAME "haiku-test:roster" +#endif + #define B_REGISTRAR_AUTHENTICATION_PORT_NAME "auth" diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 897baa18e2..8e6bc00f4f 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -16,6 +16,10 @@ #include +#ifdef HAIKU_TARGET_PLATFORM_LIBBE_TEST +# define SERVER_PORT_NAME "haiku-test:app_server" +#endif + #if TEST_MODE # define SERVER_INPUT_PORT "haiku-test:input port" #endif diff --git a/src/kits/app/AppMisc.cpp b/src/kits/app/AppMisc.cpp index 1a607f785f..e996190ab8 100644 --- a/src/kits/app/AppMisc.cpp +++ b/src/kits/app/AppMisc.cpp @@ -176,6 +176,9 @@ is_app_showing_modal_window(team_id team) } +#ifndef HAIKU_TARGET_PLATFORM_LIBBE_TEST + + /*! Creates a connection with the desktop. */ status_t @@ -208,4 +211,61 @@ create_desktop_connection(ServerLink* link, const char* name, int32 capacity) } +#else // HAIKU_TARGET_PLATFORM_LIBBE_TEST + + +static port_id sServerPort = -1; + + +port_id +get_app_server_port() +{ + if (sServerPort < 0) { + // No need for synchronization - in the worst case, we'll call + // find_port() twice. + sServerPort = find_port(SERVER_PORT_NAME); + } + + return sServerPort; +} + + +/*! Creates a connection with the desktop. +*/ +status_t +create_desktop_connection(ServerLink* link, const char* name, int32 capacity) +{ + port_id serverPort = get_app_server_port(); + if (serverPort < 0) + return serverPort; + + // Create the port so that the app_server knows where to send messages + port_id clientPort = create_port(capacity, name); + if (clientPort < 0) + return clientPort; + + link->SetTo(serverPort, clientPort); + + link->StartMessage(AS_GET_DESKTOP); + link->Attach(clientPort); + link->Attach(getuid()); + link->AttachString(getenv("TARGET_SCREEN")); + link->Attach(AS_PROTOCOL_VERSION); + + int32 code; + if (link->FlushWithReply(code) != B_OK || code != B_OK) { + link->SetSenderPort(-1); + return B_ERROR; + } + + link->Read(&serverPort); + link->SetSenderPort(serverPort); + + return B_OK; +} + + +#endif // HAIKU_TARGET_PLATFORM_LIBBE_TEST + + } // namespace BPrivate diff --git a/src/kits/app/Roster.cpp b/src/kits/app/Roster.cpp index dc6a914107..46433d1827 100644 --- a/src/kits/app/Roster.cpp +++ b/src/kits/app/Roster.cpp @@ -2604,9 +2604,10 @@ BRoster::_InitMessenger() DBG(OUT("BRoster::InitMessengers()\n")); // find the registrar port + +#ifndef HAIKU_TARGET_PLATFORM_LIBBE_TEST BMessage data; - if (BLaunchRoster().GetData("application/x-vnd.Haiku-registrar", data) - == B_OK) { + if (BLaunchRoster().GetData(B_REGISTRAR_SIGNATURE, data) == B_OK) { port_id port = data.GetInt32("port", -1); team_id team = data.GetInt32("team", -1); if (port >= 0) { @@ -2616,6 +2617,16 @@ BRoster::_InitMessenger() B_PREFERRED_TOKEN); } } +#else + port_id rosterPort = find_port(B_REGISTRAR_PORT_NAME); + port_info info; + if (rosterPort >= 0 && get_port_info(rosterPort, &info) == B_OK) { + DBG(OUT(" found roster port\n")); + + BMessenger::Private(fMessenger).SetTo(info.team, rosterPort, + B_PREFERRED_TOKEN); + } +#endif DBG(OUT("BRoster::InitMessengers() done\n")); } diff --git a/src/servers/app/AppServer.cpp b/src/servers/app/AppServer.cpp index 710d61c79a..9090086e72 100644 --- a/src/servers/app/AppServer.cpp +++ b/src/servers/app/AppServer.cpp @@ -48,7 +48,8 @@ uint32 gAppServerSIMDFlags = 0; */ AppServer::AppServer(status_t* status) : - BServer("application/x-vnd.Haiku-app_server", "picasso", -1, false, status), + SERVER_BASE("application/x-vnd.Haiku-app_server", "picasso", -1, false, + status), fDesktopLock("AppServerDesktopLock") { openlog("app_server", 0, LOG_DAEMON); @@ -153,7 +154,10 @@ AppServer::QuitRequested() wait_for_thread(thread, &status); } - return BServer::QuitRequested(); + delete this; + exit(0); + + return SERVER_BASE::QuitRequested(); #else return false; #endif diff --git a/src/servers/app/AppServer.h b/src/servers/app/AppServer.h index 9320edb9d1..e25beaad58 100644 --- a/src/servers/app/AppServer.h +++ b/src/servers/app/AppServer.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -23,12 +22,21 @@ #include "ServerConfig.h" +#ifndef HAIKU_TARGET_PLATFORM_LIBBE_TEST +# include +# define SERVER_BASE BServer +#else +# include "TestServerLoopAdapter.h" +# define SERVER_BASE TestServerLoopAdapter +#endif + + class ServerApp; class BitmapManager; class Desktop; -class AppServer : public BServer { +class AppServer : public SERVER_BASE { public: AppServer(status_t* status); virtual ~AppServer(); @@ -39,7 +47,7 @@ public: private: Desktop* _CreateDesktop(uid_t userID, const char* targetScreen); - Desktop* _FindDesktop(uid_t userID, + virtual Desktop* _FindDesktop(uid_t userID, const char* targetScreen); void _LaunchInputServer(); diff --git a/src/servers/app/MessageLooper.cpp b/src/servers/app/MessageLooper.cpp index e801712eed..2828b8ef4d 100644 --- a/src/servers/app/MessageLooper.cpp +++ b/src/servers/app/MessageLooper.cpp @@ -154,9 +154,9 @@ MessageLooper::_MessageLooper() Lock(); - if (code == kMsgQuitLooper) { + if (code == kMsgQuitLooper) Quit(); - } else + else _DispatchMessage(code, receiver); Unlock(); diff --git a/src/servers/app/TestServerLoopAdapter.cpp b/src/servers/app/TestServerLoopAdapter.cpp new file mode 100644 index 0000000000..a12cdc86b6 --- /dev/null +++ b/src/servers/app/TestServerLoopAdapter.cpp @@ -0,0 +1,121 @@ +/* + * Copyright 2001-2015, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * DarkWyrm + * Axel Dörfler, axeld@pinc-software.de + * Stephan Aßmus + * Christian Packmann + * Julian Harnath + */ +#include "TestServerLoopAdapter.h" + +#include "Desktop.h" +#include "ServerConfig.h" +#include "ServerProtocol.h" + +#include + +#include + +//#define DEBUG_SERVER +#ifdef DEBUG_SERVER +# include +# define STRACE(x) printf x +#else +# define STRACE(x) ; +#endif + + +TestServerLoopAdapter::TestServerLoopAdapter(const char* signature, + const char*, port_id, bool, status_t* outError) + : + MessageLooper("test-app_server"), + fMessagePort(_CreatePort()) +{ + fLink.SetReceiverPort(fMessagePort); + *outError = B_OK; +} + + +TestServerLoopAdapter::~TestServerLoopAdapter() +{ +} + + +bool +TestServerLoopAdapter::Run() +{ + rename_thread(find_thread(NULL), "picasso"); + _message_thread((void*)this); + return true; +} + + +void +TestServerLoopAdapter::_DispatchMessage(int32 code, + BPrivate::LinkReceiver& link) +{ + switch (code) { + case AS_GET_DESKTOP: + { + port_id replyPort = 0; + link.Read(&replyPort); + + int32 userID = -1; + link.Read(&userID); + + char* targetScreen = NULL; + link.ReadString(&targetScreen); + + int32 version = -1; + link.Read(&version); + + BMessage message(AS_GET_DESKTOP); + message.AddInt32("user", userID); + message.AddInt32("version", version); + message.AddString("target", targetScreen); + MessageReceived(&message); + + // AppServer will try to send a reply, we just let that fail + // since we can find out the port by getting the desktop instance + // ourselves + + free(targetScreen); + Desktop* desktop = _FindDesktop(userID, targetScreen); + + BPrivate::LinkSender reply(replyPort); + if (desktop != NULL) { + reply.StartMessage(B_OK); + reply.Attach(desktop->MessagePort()); + } else + reply.StartMessage(B_ERROR); + + reply.Flush(); + + break; + } + + case B_QUIT_REQUESTED: + { + QuitRequested(); + break; + } + + default: + STRACE(("Server::MainLoop received unexpected code %" B_PRId32 " " + "(offset %" B_PRId32 ")\n", code, code - SERVER_TRUE)); + break; + } +} + + +port_id +TestServerLoopAdapter::_CreatePort() +{ + port_id port = create_port(DEFAULT_MONITOR_PORT_SIZE, SERVER_PORT_NAME); + if (port < B_OK) + debugger("test-app_server could not create message port"); + return port; +} diff --git a/src/servers/app/TestServerLoopAdapter.h b/src/servers/app/TestServerLoopAdapter.h new file mode 100644 index 0000000000..f3d2879f6e --- /dev/null +++ b/src/servers/app/TestServerLoopAdapter.h @@ -0,0 +1,51 @@ +/* + * Copyright 2001-2015, Haiku, Inc. + * Distributed under the terms of the MIT license. + * + * Authors: + * DarkWyrm + * Axel Dörfler, axeld@pinc-software.de + * Julian Harnath, + */ +#ifndef TEST_SERVER_LOOP_ADAPTER_H +#define TEST_SERVER_LOOP_ADAPTER_H + +#include "MessageLooper.h" + + +class BMessage; +class Desktop; + + +class TestServerLoopAdapter : public MessageLooper { +public: + TestServerLoopAdapter(const char* signature, + const char* looperName, port_id port, + bool initGui, status_t* outError); + virtual ~TestServerLoopAdapter(); + + // MessageLooper interface + virtual port_id MessagePort() const { return fMessagePort; } + virtual bool Run(); + + // BApplication interface + virtual void MessageReceived(BMessage* message) = 0; + virtual bool QuitRequested() { return true; } + +private: + // MessageLooper interface + virtual void _DispatchMessage(int32 code, + BPrivate::LinkReceiver &link); + + virtual Desktop* _FindDesktop(uid_t userID, + const char* targetScreen) = 0; + port_id _CreatePort(); + + + +private: + port_id fMessagePort; +}; + + +#endif // TEST_SERVER_LOOP_ADAPTER_H diff --git a/src/servers/app/drawing/DWindowHWInterface.cpp b/src/servers/app/drawing/DWindowHWInterface.cpp index a903ab5b1a..70e535c7b5 100644 --- a/src/servers/app/drawing/DWindowHWInterface.cpp +++ b/src/servers/app/drawing/DWindowHWInterface.cpp @@ -694,7 +694,8 @@ DWindowHWInterface::SetMode(const display_mode& mode) // has not been created either, but we need one to display // a real BWindow in the test environment. // be_app->Run() needs to be called in another thread - BApplication* app = new BApplication("application/x-vnd.haiku-app-server"); + BApplication* app = new BApplication( + "application/x-vnd.Haiku-test-app_server"); app->Unlock(); thread_id appThread = spawn_thread(run_app_thread, "app thread", diff --git a/src/servers/app/drawing/ViewHWInterface.cpp b/src/servers/app/drawing/ViewHWInterface.cpp index fe4ca9879c..4fec110348 100644 --- a/src/servers/app/drawing/ViewHWInterface.cpp +++ b/src/servers/app/drawing/ViewHWInterface.cpp @@ -483,7 +483,8 @@ ViewHWInterface::SetMode(const display_mode& mode) // has not been created either, but we need one to display // a real BWindow in the test environment. // be_app->Run() needs to be called in another thread - BApplication* app = new BApplication("application/x-vnd.haiku-app-server"); + BApplication* app = new BApplication( + "application/x-vnd.Haiku-test-app_server"); app->Unlock(); thread_id appThread = spawn_thread(run_app_thread, "app thread", diff --git a/src/servers/app/test_app_server.rdef b/src/servers/app/test_app_server.rdef index 29a0c4c9fe..e71bea4fbc 100644 --- a/src/servers/app/test_app_server.rdef +++ b/src/servers/app/test_app_server.rdef @@ -2,7 +2,7 @@ * app_server.rdef */ -resource app_signature "application/x-vnd.Haiku-app-server"; +resource app_signature "application/x-vnd.Haiku-test-app_server"; resource app_flags B_EXCLUSIVE_LAUNCH ; diff --git a/src/servers/registrar/Registrar.cpp b/src/servers/registrar/Registrar.cpp index 79b3d02a66..7987a1bc63 100644 --- a/src/servers/registrar/Registrar.cpp +++ b/src/servers/registrar/Registrar.cpp @@ -57,7 +57,7 @@ static const bigtime_t kRosterSanityEventInterval = 1000000LL; */ Registrar::Registrar(status_t* _error) : - BServer(B_REGISTRAR_SIGNATURE, "system:roster", -1, false, _error), + BServer(B_REGISTRAR_SIGNATURE, B_REGISTRAR_PORT_NAME, -1, false, _error), fRoster(NULL), fClipboardHandler(NULL), fMIMEManager(NULL), diff --git a/src/tests/servers/app/Jamfile b/src/tests/servers/app/Jamfile index de8d379f46..24598d765f 100644 --- a/src/tests/servers/app/Jamfile +++ b/src/tests/servers/app/Jamfile @@ -127,6 +127,7 @@ SharedLibrary libtestappserver.so : ProfileMessageSupport.cpp EventDispatcher.cpp EventStream.cpp + TestServerLoopAdapter.cpp MessageLooper.cpp # Decorator diff --git a/src/tests/servers/registrar/Jamfile b/src/tests/servers/registrar/Jamfile index 91d8c362c2..fe142624dc 100644 --- a/src/tests/servers/registrar/Jamfile +++ b/src/tests/servers/registrar/Jamfile @@ -110,7 +110,7 @@ Server test_registrar libstorage_kit_mime.a be localestub [ TargetLibstdc++ ] : - registrar.rdef + test_registrar.rdef ; if $(TARGET_PLATFORM) = libbe_test { diff --git a/src/tests/servers/registrar/run_test_registrar.cpp b/src/tests/servers/registrar/run_test_registrar.cpp index 20cf63bcb1..a32a2382a7 100644 --- a/src/tests/servers/registrar/run_test_registrar.cpp +++ b/src/tests/servers/registrar/run_test_registrar.cpp @@ -53,7 +53,7 @@ main(int argc, char* argv[]) while (get_next_thread_info(teamInfo.team, &threadCookie, &threadInfo) == B_OK) { // search for the roster thread - if (!strcmp(threadInfo.name, "_roster_thread_")) { + if (!strcmp(threadInfo.name, "roster")) { port_id port = find_port("haiku-test:roster"); port_info portInfo; if (get_port_info(port, &portInfo) == B_OK diff --git a/src/tests/servers/registrar/test_registrar.rdef b/src/tests/servers/registrar/test_registrar.rdef new file mode 100644 index 0000000000..2748c0b157 --- /dev/null +++ b/src/tests/servers/registrar/test_registrar.rdef @@ -0,0 +1,96 @@ +/* + * registrar.rdef + */ + +resource app_signature "application/x-vnd.test-registrar"; + +resource app_flags B_EXCLUSIVE_LAUNCH | B_BACKGROUND_APP; + /* the registrar's application flags are actually + * ignored. + * The actually used flags are set in TRoster::Init(). + */ + +resource app_version { + major = 1, + middle = 0, + minor = 0, + + variety = B_APPV_ALPHA, + internal = 0, + + short_info = "registrar", + long_info = "registrar ©2005-2008 Haiku Inc." +}; + +#ifdef HAIKU_TARGET_PLATFORM_HAIKU + +resource vector_icon array { + $"6E6369660704006B0500020006023BB8A43D8642BF898E3DBC1F4BAE5447805C" + $"00E3AD00FFBC8F05020106023D66A73B07B6B9BEF73C1A2B48379549C4DE3D76" + $"9564FF536E4402000602B898C93319083A5C163FF4CC4AB5EA4451BB00B58A00" + $"FF8565030200060236EEF83B80F5BF3E743AB74A4B669742DBD600FFEFC0FFFF" + $"DE7C05FF0D0A044D5B585B59594D530A0626484C5B4E594E32282626270A0426" + $"484C5B4C3426270A0448542A452A2C48370A042C442C2D2A2C2A450A044C5B4E" + $"594E324C340A04282626274C344E320A042A45485448512C4408023133313C08" + $"023534353E08023936394008023D373D4208022E344040090A00010010011584" + $"00040A0101011001178400040A020102000A030103000A040104000A04010500" + $"0A050106000A050107000A06050C0B0A0908100117820004" +}; + +#else + +resource large_icon array { + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFF00D9D9D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFF00D98383D9D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFF00D900008383D9D90000FFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF" + $"FFFFFFFF00D9008F00008383D9D9000000000000FFFF003FD9D9D90000FFFFFF" + $"FFFFFFFF00D9008F8F8F00008383D9D900003F3F00003FD9D9D9D9D9D90000FF" + $"FFFFFFFF00D9008F3F8F8F8F00008383D9D900003F3FAAAAD9D9D9D9D9D98300" + $"FFFFFFFF00D9003F3F8F3F8F8F8F00008383D9D900008383AAAAD9D9D983AA00" + $"FFFFFFFF00D9008F3F3F3F8F3F8F8F8F00008383D9D900003F3FAAAA83AAAA00" + $"FFFFFFFF00D9008F3F8F3F8F3F8F8F8F8F8F00008383D9D900D93F3FAAAAAA00" + $"FFFFFFFF00D9008F3F8F3F3F3F8F8F8F8F8F8F8F000083AA00D9D9D983AA0111" + $"FFFFFFFF00D9008F8F8F3F8F3F8F8F8F8F8F8F8F8F0083AA00D9D9D9D9AA0017" + $"FFFFFFFF00D9008F8F8F8F8F3F3F8F8F8F8F8F8F8F0083AA00D9D9D9D9830011" + $"FFFFFFFF00D9008F8F8F8F8F8F8F3F8F8F8F8F8F8F0083AA00D9D9D983AA0111" + $"FFFFFFFF00D900008F8F8F8F8F8F8F8F8F8F8F8F8F0083AA00D9D983AA001111" + $"FFFFFFFF0000838300008F8F8F8F8F8F8F8F8F8F8F0083AA00D983AA001111FF" + $"FFFFFFFFFF000000838300008F8F8F8F8F8F8F8F8F0083AA0083AA001111FFFF" + $"FFFFFFFF003FD9830000838300008F8F8F8F8F8F8F0083AA00AA001111FFFFFF" + $"FFFFFF003FD98383001E0000838300008F8F8F8F8F0083AA00001111FFFFFFFF" + $"FFFF003FD98383031ED9D9830000838300008F8F8F0083AA001111FFFFFFFFFF" + $"FF003FD98383003FD9D98383003F0000838300008F0083AA0011FFFFFFFFFFFF" + $"003FD98383003FD9D98383003FD9D9D900008383000083AA0011FFFFFFFFFFFF" + $"00D98383003FD9D98383003FD9D98383003F0000838383AA0011FFFFFFFFFFFF" + $"FF0000003FD9D98383003FD9D98383003FD98383000083001111FFFFFFFFFFFF" + $"FFFF003FD9D98383003FD9D98383003FD98383001111001111FFFFFFFFFFFFFF" + $"FFFF00D9838306003FD9D98383003FD98383001111FFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFF0000001000D9D98383003FD98383001111FFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFF000000003FD98300001111FFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFF000000111111FFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +resource mini_icon array { + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + $"FFFF000000FFFFFFFFFFFFFFFFFFFFFF" + $"FF03D9D9D90000FFFFFFFF0000FFFFFF" + $"FF03D9B6B6D9D900000000D9D90000FF" + $"FF03D9B669B6B6D9D90000AAAAD98300" + $"FF03D9B6116868B6B6D9D9003FAAAA00" + $"FF03D9B68F681B8FB683AA00D9D9AA00" + $"FF03D9B68F181B8FB683AA003FD9AA01" + $"FF03D9B6B68F188FB683AA00D9830011" + $"FF03038383B6B68FB683AA00830011FF" + $"FF00D933048383B6B683AA000011FFFF" + $"00D98300D90303838383AA0011FFFFFF" + $"008300D98300D90303030011FFFFFFFF" + $"FF00D98300D900D9830011FFFFFFFFFF" + $"FFFF0000000000000011FFFFFFFFFFFF" + $"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +}; + +#endif // HAIKU_TARGET_PLATFORM_HAIKU