1.1 --- a/core/ShareSys.cpp Wed Oct 28 00:31:48 2009 -0700
1.2 +++ b/core/ShareSys.cpp Wed Oct 28 00:37:34 2009 -0700
1.3 @@ -527,3 +527,85 @@
1.4
1.5 return pEntry;
1.6 }
1.7 +
1.8 +void ShareSystem::AddCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
1.9 + const char *name)
1.10 +{
1.11 + if (m_caps.retrieve(name) != NULL)
1.12 + return;
1.13 +
1.14 + Capability cap;
1.15 + cap.ext = myself;
1.16 + cap.provider = provider;
1.17 +
1.18 + m_caps.insert(name, cap);
1.19 +}
1.20 +
1.21 +void ShareSystem::DropCapabilityProvider(IExtension *myself, IFeatureProvider *provider,
1.22 + const char *name)
1.23 +{
1.24 + Capability *pCap = m_caps.retrieve(name);
1.25 + if (pCap == NULL)
1.26 + return;
1.27 +
1.28 + if (pCap->ext != myself || pCap->provider != provider)
1.29 + return;
1.30 +
1.31 + m_caps.remove(name);
1.32 +}
1.33 +
1.34 +FeatureStatus ShareSystem::TestFeature(IPluginRuntime *pRuntime, FeatureType feature,
1.35 + const char *name)
1.36 +{
1.37 + switch (feature)
1.38 + {
1.39 + case FeatureType_Native:
1.40 + return TestNative(pRuntime, name);
1.41 + case FeatureType_Capability:
1.42 + return TestCap(name);
1.43 + default:
1.44 + break;
1.45 + }
1.46 +
1.47 + return FeatureStatus_Unknown;
1.48 +}
1.49 +
1.50 +FeatureStatus ShareSystem::TestNative(IPluginRuntime *pRuntime, const char *name)
1.51 +{
1.52 + uint32_t index;
1.53 +
1.54 + if (pRuntime->FindNativeByName(name, &index) == SP_ERROR_NONE)
1.55 + {
1.56 + sp_native_t *native;
1.57 + if (pRuntime->GetNativeByIndex(index, &native) == SP_ERROR_NONE)
1.58 + {
1.59 + if (native->status == SP_NATIVE_BOUND)
1.60 + return FeatureStatus_Available;
1.61 + else
1.62 + return FeatureStatus_Unknown;
1.63 + }
1.64 + }
1.65 +
1.66 + NativeEntry *entry = FindNative(name);
1.67 + if (entry == NULL)
1.68 + return FeatureStatus_Unknown;
1.69 +
1.70 + if ((entry->replacement.owner != NULL || entry->owner != NULL) &&
1.71 + (entry->replacement.func != NULL || entry->func != NULL))
1.72 + {
1.73 + return FeatureStatus_Available;
1.74 + }
1.75 + else
1.76 + {
1.77 + return FeatureStatus_Unavailable;
1.78 + }
1.79 +}
1.80 +
1.81 +FeatureStatus ShareSystem::TestCap(const char *name)
1.82 +{
1.83 + Capability *cap = m_caps.retrieve(name);
1.84 + if (cap == NULL)
1.85 + return FeatureStatus_Unknown;
1.86 +
1.87 + return cap->provider->GetFeatureStatus(FeatureType_Capability, name);
1.88 +}