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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llplugininstance.cpp
  3.  * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
  4.  *
  5.  * @cond
  6.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2008-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  * @endcond
  33.  */
  34. #include "linden_common.h"
  35. #include "llplugininstance.h"
  36. #include "llapr.h"
  37. /** Virtual destructor. */
  38. LLPluginInstanceMessageListener::~LLPluginInstanceMessageListener()
  39. {
  40. }
  41. /** 
  42.  * TODO:DOC describe how it's used
  43.  */
  44. const char *LLPluginInstance::PLUGIN_INIT_FUNCTION_NAME = "LLPluginInitEntryPoint";
  45. /** 
  46.  * Constructor.
  47.  *
  48.  * @param[in] owner Plugin instance. TODO:DOC is this a good description of what "owner" is?
  49.  */
  50. LLPluginInstance::LLPluginInstance(LLPluginInstanceMessageListener *owner) :
  51. mDSOHandle(NULL),
  52. mPluginUserData(NULL),
  53. mPluginSendMessageFunction(NULL)
  54. {
  55. mOwner = owner;
  56. }
  57. /** 
  58.  * Destructor.
  59.  */
  60. LLPluginInstance::~LLPluginInstance()
  61. {
  62. if(mDSOHandle != NULL)
  63. {
  64. apr_dso_unload(mDSOHandle);
  65. mDSOHandle = NULL;
  66. }
  67. }
  68. /** 
  69.  * Dynamically loads the plugin and runs the plugin's init function.
  70.  *
  71.  * @param[in] plugin_file Name of plugin dll/dylib/so. TODO:DOC is this correct? see .h
  72.  * @return 0 if successful, APR error code or error code from the plugin's init function on failure.
  73.  */
  74. int LLPluginInstance::load(std::string &plugin_file)
  75. {
  76. pluginInitFunction init_function = NULL;
  77. int result = apr_dso_load(&mDSOHandle,
  78.   plugin_file.c_str(),
  79.   gAPRPoolp);
  80. if(result != APR_SUCCESS)
  81. {
  82. char buf[1024];
  83. apr_dso_error(mDSOHandle, buf, sizeof(buf));
  84. LL_WARNS("Plugin") << "apr_dso_load of " << plugin_file << " failed with error " << result << " , additional info string: " << buf << LL_ENDL;
  85. }
  86. if(result == APR_SUCCESS)
  87. {
  88. result = apr_dso_sym((apr_dso_handle_sym_t*)&init_function,
  89.  mDSOHandle,
  90.  PLUGIN_INIT_FUNCTION_NAME);
  91. if(result != APR_SUCCESS)
  92. {
  93. LL_WARNS("Plugin") << "apr_dso_sym failed with error " << result << LL_ENDL;
  94. }
  95. }
  96. if(result == APR_SUCCESS)
  97. {
  98. result = init_function(staticReceiveMessage, (void*)this, &mPluginSendMessageFunction, &mPluginUserData);
  99. if(result != APR_SUCCESS)
  100. {
  101. LL_WARNS("Plugin") << "call to init function failed with error " << result << LL_ENDL;
  102. }
  103. }
  104. return (int)result;
  105. }
  106. /** 
  107.  * Sends a message to the plugin.
  108.  *
  109.  * @param[in] message Message
  110.  */
  111. void LLPluginInstance::sendMessage(const std::string &message)
  112. {
  113. if(mPluginSendMessageFunction)
  114. {
  115. LL_DEBUGS("Plugin") << "sending message to plugin: "" << message << """ << LL_ENDL;
  116. mPluginSendMessageFunction(message.c_str(), &mPluginUserData);
  117. }
  118. else
  119. {
  120. LL_WARNS("Plugin") << "dropping message: "" << message << """ << LL_ENDL;
  121. }
  122. }
  123. /**
  124.  * Idle. TODO:DOC what's the purpose of this?
  125.  *
  126.  */
  127. void LLPluginInstance::idle(void)
  128. {
  129. }
  130. // static
  131. void LLPluginInstance::staticReceiveMessage(const char *message_string, void **user_data)
  132. {
  133. // TODO: validate that the user_data argument is still a valid LLPluginInstance pointer
  134. // we could also use a key that's looked up in a map (instead of a direct pointer) for safety, but that's probably overkill
  135. LLPluginInstance *self = (LLPluginInstance*)*user_data;
  136. self->receiveMessage(message_string);
  137. }
  138. /**
  139.  * Plugin receives message from plugin loader shell.
  140.  *
  141.  * @param[in] message_string Message
  142.  */
  143. void LLPluginInstance::receiveMessage(const char *message_string)
  144. {
  145. if(mOwner)
  146. {
  147. LL_DEBUGS("Plugin") << "processing incoming message: "" << message_string << """ << LL_ENDL;
  148. mOwner->receivePluginMessage(message_string);
  149. }
  150. else
  151. {
  152. LL_WARNS("Plugin") << "dropping incoming message: "" << message_string << """ << LL_ENDL;
  153. }
  154. }