private unsafe bool SetProperty (XamlCallbackData *data, string xmlns, Value* target_ptr, IntPtr target_data, Value* target_parent_ptr, string prop_xmlns, string name, Value* value_ptr, IntPtr value_data)
{
string error;
object target = Value.ToObject (null, target_ptr);
if (target == null) {
Console.Error.WriteLine ("target is null: {0} {1} {2}", (IntPtr)target_ptr, name, xmlns);
return false;
}
if (name == null) {
if (TrySetEnumContentProperty (data, xmlns, target, target_ptr, target_data, value_ptr, value_data))
return true;
if (TrySetCollectionContentProperty (xmlns, target, target_ptr, target_data, value_ptr, value_data))
return true;
if (TrySetObjectTextProperty (data, xmlns, target, target_ptr, target_data, value_ptr, value_data))
return true;
Console.Error.WriteLine ("no property name supplied");
return false;
}
string full_name = name;
int dot = name.IndexOf ('.');
string type_name = null;
if (dot >= 0) {
type_name = name.Substring (0, dot);
if (prop_xmlns != null) {
string ns = ClrNamespaceFromXmlns (prop_xmlns);
if (ns != null)
type_name = String.Concat (ns, ".", type_name);
}
name = name.Substring (++dot, name.Length - dot);
}
if (TrySetExpression (data, xmlns, target, target_data, target_parent_ptr, type_name, prop_xmlns, name, full_name, value_ptr, value_data))
return true;
if (!IsAttachedProperty (data, target, xmlns, prop_xmlns, full_name)) {
if (TrySetPropertyReflection (data, xmlns, target, target_data, target_parent_ptr, type_name, name, value_ptr, value_data, out error))
return true;
if (TrySetEventReflection (data, xmlns, target, type_name, name, value_ptr, out error))
return true;
} else {
if (TrySetAttachedProperty (data, xmlns, target, target_data, prop_xmlns, full_name, value_ptr))
return true;
}
return false;
}