core/ShareSys.cpp
changeset 2841 dde3dd0b4b8b
parent 2411 8dfaa3d730b5
     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 +}