00001 #include "ace/Dynamic_Service_Base.h"
00002 #include "ace/ACE.h"
00003 #include "ace/Service_Config.h"
00004 #include "ace/Service_Repository.h"
00005 #include "ace/Service_Types.h"
00006 #include "ace/Log_Msg.h"
00007
00008
00009 ACE_RCSID (ace,
00010 Dynamic_Service_Base,
00011 "$Id: Dynamic_Service_Base.cpp 79134 2007-07-31 18:23:50Z johnnyw $")
00012
00013 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00014
00015
00016 void
00017 ACE_Dynamic_Service_Base::dump (void) const
00018 {
00019 #if defined (ACE_HAS_DUMP)
00020 ACE_TRACE ("ACE_Dynamic_Service_Base::dump");
00021
00022 ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
00023 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n")));
00024 ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
00025 #endif
00026 }
00027
00028
00029
00030
00031 void *
00032 ACE_Dynamic_Service_Base::instance (const ACE_TCHAR *name, bool no_global)
00033 {
00034 ACE_TRACE ("ACE_Dynamic_Service_Base::instance");
00035 return instance (ACE_Service_Config::current (), name, no_global);
00036 }
00037
00038
00039 void *
00040 ACE_Dynamic_Service_Base::instance (const ACE_TCHAR *name)
00041 {
00042 ACE_TRACE ("ACE_Dynamic_Service_Base::instance");
00043 return instance (ACE_Service_Config::current (), name, false);
00044 }
00045
00046
00047
00048
00049 const ACE_Service_Type *
00050 ACE_Dynamic_Service_Base::find_i (const ACE_Service_Gestalt* &repo,
00051 const ACE_TCHAR *name,
00052 bool no_global)
00053 {
00054 ACE_TRACE ("ACE_Dynamic_Service_Base::find_i");
00055 const ACE_Service_Type *svc_rec = 0;
00056
00057 ACE_Service_Gestalt* global = ACE_Service_Config::global ();
00058
00059 for ( ; (repo->find (name, &svc_rec) == -1) && !no_global; repo = global)
00060 {
00061
00062 if (repo == global)
00063 break;
00064 }
00065
00066 return svc_rec;
00067 }
00068
00069
00070
00071 void *
00072 ACE_Dynamic_Service_Base::instance (const ACE_Service_Gestalt* repo,
00073 const ACE_TCHAR *name,
00074 bool no_global)
00075 {
00076 ACE_TRACE ("ACE_Dynamic_Service_Base::instance");
00077
00078 void *obj = 0;
00079 const ACE_Service_Type_Impl *type = 0;
00080
00081 const ACE_Service_Gestalt* repo_found = repo;
00082 const ACE_Service_Type *svc_rec = find_i (repo_found, name, no_global);
00083 if (svc_rec != 0)
00084 {
00085 type = svc_rec->type ();
00086 if (type != 0)
00087 obj = type->object ();
00088 }
00089
00090 if (ACE::debug ())
00091 {
00092 ACE_Guard <ACE_Log_Msg> log_guard (*ACE_Log_Msg::instance ());
00093
00094 ACE_DEBUG ((LM_DEBUG,
00095 ACE_TEXT ("ACE (%P|%t) DSB::instance, repo=%@, name=%s")
00096 ACE_TEXT (" type=%@ => %@"),
00097 repo->repo_, name, type, obj));
00098
00099 if (repo->repo_ != repo_found->repo_)
00100 ACE_DEBUG ((LM_DEBUG,
00101 ACE_TEXT (" [in repo=%@]\n"),
00102 repo_found->repo_));
00103 else
00104 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n")));
00105 }
00106
00107 return obj;
00108 }
00109
00110
00111
00112
00113 void *
00114 ACE_Dynamic_Service_Base::instance (const ACE_Service_Gestalt* repo,
00115 const ACE_TCHAR *name)
00116 {
00117 return instance (repo, name, false);
00118 }
00119
00120
00121 ACE_END_VERSIONED_NAMESPACE_DECL