llappviewerlinux_api_dbus.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llappviewerlinux_api_dbus.cpp
  3.  * @brief dynamic DBus symbol-grabbing code
  4.  *
  5.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2008-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #if LL_DBUS_ENABLED
  33. #include "linden_common.h"
  34. extern "C" {
  35. #include <dbus/dbus-glib.h>
  36. #include "apr_pools.h"
  37. #include "apr_dso.h"
  38. }
  39. #define DEBUGMSG(...) do { lldebugs << llformat(__VA_ARGS__) << llendl; } while(0)
  40. #define INFOMSG(...) do { llinfos << llformat(__VA_ARGS__) << llendl; } while(0)
  41. #define WARNMSG(...) do { llwarns << llformat(__VA_ARGS__) << llendl; } while(0)
  42. #define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) RTN (*ll##DBUSSYM)(__VA_ARGS__) = NULL
  43. #include "llappviewerlinux_api_dbus_syms_raw.inc"
  44. #undef LL_DBUS_SYM
  45. static bool sSymsGrabbed = false;
  46. static apr_pool_t *sSymDBUSDSOMemoryPool = NULL;
  47. static apr_dso_handle_t *sSymDBUSDSOHandleG = NULL;
  48. bool grab_dbus_syms(std::string dbus_dso_name)
  49. {
  50. if (sSymsGrabbed)
  51. {
  52. // already have grabbed good syms
  53. return TRUE;
  54. }
  55. bool sym_error = false;
  56. bool rtn = false;
  57. apr_status_t rv;
  58. apr_dso_handle_t *sSymDBUSDSOHandle = NULL;
  59. #define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##DBUSSYM, sSymDBUSDSOHandle, #DBUSSYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #DBUSSYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #DBUSSYM, (void*)ll##DBUSSYM);}while(0)
  60. //attempt to load the shared library
  61. apr_pool_create(&sSymDBUSDSOMemoryPool, NULL);
  62.   
  63. if ( APR_SUCCESS == (rv = apr_dso_load(&sSymDBUSDSOHandle,
  64.        dbus_dso_name.c_str(),
  65.        sSymDBUSDSOMemoryPool) ))
  66. {
  67. INFOMSG("Found DSO: %s", dbus_dso_name.c_str());
  68. #include "llappviewerlinux_api_dbus_syms_raw.inc"
  69.       
  70. if ( sSymDBUSDSOHandle )
  71. {
  72. sSymDBUSDSOHandleG = sSymDBUSDSOHandle;
  73. sSymDBUSDSOHandle = NULL;
  74. }
  75.       
  76. rtn = !sym_error;
  77. }
  78. else
  79. {
  80. INFOMSG("Couldn't load DSO: %s", dbus_dso_name.c_str());
  81. rtn = false; // failure
  82. }
  83. if (sym_error)
  84. {
  85. WARNMSG("Failed to find necessary symbols in DBUS-GLIB libraries.");
  86. }
  87. #undef LL_DBUS_SYM
  88. sSymsGrabbed = rtn;
  89. return rtn;
  90. }
  91. void ungrab_dbus_syms()
  92. // should be safe to call regardless of whether we've
  93. // actually grabbed syms.
  94. if ( sSymDBUSDSOHandleG )
  95. {
  96. apr_dso_unload(sSymDBUSDSOHandleG);
  97. sSymDBUSDSOHandleG = NULL;
  98. }
  99. if ( sSymDBUSDSOMemoryPool )
  100. {
  101. apr_pool_destroy(sSymDBUSDSOMemoryPool);
  102. sSymDBUSDSOMemoryPool = NULL;
  103. }
  104. // NULL-out all of the symbols we'd grabbed
  105. #define LL_DBUS_SYM(REQUIRED, DBUSSYM, RTN, ...) do{ll##DBUSSYM = NULL;}while(0)
  106. #include "llappviewerlinux_api_dbus_syms_raw.inc"
  107. #undef LL_DBUS_SYM
  108. sSymsGrabbed = false;
  109. }
  110. #endif // LL_DBUS_ENABLED