add addititional value null checks

This commit is contained in:
Matthias Mailänder
2015-07-05 08:47:05 +02:00
parent a77e0782cf
commit aab6d6d170

View File

@@ -157,69 +157,81 @@ namespace OpenRA
else if (fieldType == typeof(float)) else if (fieldType == typeof(float))
{ {
float res; float res;
if (float.TryParse(value.Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res)) if (value != null && float.TryParse(value.Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res))
return res * (value.Contains('%') ? 0.01f : 1f); return res * (value.Contains('%') ? 0.01f : 1f);
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(decimal)) else if (fieldType == typeof(decimal))
{ {
decimal res; decimal res;
if (decimal.TryParse(value.Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res)) if (value != null && decimal.TryParse(value.Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res))
return res * (value.Contains('%') ? 0.01m : 1m); return res * (value.Contains('%') ? 0.01m : 1m);
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(string)) else if (fieldType == typeof(string))
{ {
if (field != null && MemberHasTranslateAttribute[field]) if (field != null && MemberHasTranslateAttribute[field] && value != null)
return Regex.Replace(value, "@[^@]+@", m => Translate(m.Value.Substring(1, m.Value.Length - 2)), RegexOptions.Compiled); return Regex.Replace(value, "@[^@]+@", m => Translate(m.Value.Substring(1, m.Value.Length - 2)), RegexOptions.Compiled);
return value; return value;
} }
else if (fieldType == typeof(Color)) else if (fieldType == typeof(Color))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length == 3) {
return Color.FromArgb( var parts = value.Split(',');
Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255), if (parts.Length == 3)
Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255), return Color.FromArgb(
Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255)); Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255),
if (parts.Length == 4) Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255),
return Color.FromArgb( Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255));
Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255), if (parts.Length == 4)
Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255), return Color.FromArgb(
Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255), Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[3]).Clamp(0, 255)); Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[3]).Clamp(0, 255));
}
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(Color[])) else if (fieldType == typeof(Color[]))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length % 4 != 0)
return InvalidValueAction(value, fieldType, fieldName);
var colors = new Color[parts.Length / 4];
for (var i = 0; i < colors.Length; i++)
{ {
colors[i] = Color.FromArgb( var parts = value.Split(',');
Exts.ParseIntegerInvariant(parts[4 * i]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[4 * i + 1]).Clamp(0, 255), if (parts.Length % 4 != 0)
Exts.ParseIntegerInvariant(parts[4 * i + 2]).Clamp(0, 255), return InvalidValueAction(value, fieldType, fieldName);
Exts.ParseIntegerInvariant(parts[4 * i + 3]).Clamp(0, 255));
var colors = new Color[parts.Length / 4];
for (var i = 0; i < colors.Length; i++)
{
colors[i] = Color.FromArgb(
Exts.ParseIntegerInvariant(parts[4 * i]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[4 * i + 1]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[4 * i + 2]).Clamp(0, 255),
Exts.ParseIntegerInvariant(parts[4 * i + 3]).Clamp(0, 255));
}
return colors;
} }
return colors; return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(HSLColor)) else if (fieldType == typeof(HSLColor))
{ {
var parts = value.Split(','); if (value != null)
{
var parts = value.Split(',');
// Allow old ColorRamp format to be parsed as HSLColor // Allow old ColorRamp format to be parsed as HSLColor
if (parts.Length == 3 || parts.Length == 4) if (parts.Length == 3 || parts.Length == 4)
return new HSLColor( return new HSLColor(
(byte)Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255), (byte)Exts.ParseIntegerInvariant(parts[0]).Clamp(0, 255),
(byte)Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255), (byte)Exts.ParseIntegerInvariant(parts[1]).Clamp(0, 255),
(byte)Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255)); (byte)Exts.ParseIntegerInvariant(parts[2]).Clamp(0, 255));
}
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
@@ -241,44 +253,53 @@ namespace OpenRA
} }
else if (fieldType == typeof(WVec)) else if (fieldType == typeof(WVec))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length == 3)
{ {
WRange rx, ry, rz; var parts = value.Split(',');
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz)) if (parts.Length == 3)
return new WVec(rx, ry, rz); {
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WVec(rx, ry, rz);
}
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(WVec[])) else if (fieldType == typeof(WVec[]))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length % 3 != 0)
return InvalidValueAction(value, fieldType, fieldName);
var vecs = new WVec[parts.Length / 3];
for (var i = 0; i < vecs.Length; ++i)
{ {
WRange rx, ry, rz; var parts = value.Split(',');
if (WRange.TryParse(parts[3 * i], out rx)
&& WRange.TryParse(parts[3 * i + 1], out ry) if (parts.Length % 3 != 0)
&& WRange.TryParse(parts[3 * i + 2], out rz)) return InvalidValueAction(value, fieldType, fieldName);
vecs[i] = new WVec(rx, ry, rz);
var vecs = new WVec[parts.Length / 3];
for (var i = 0; i < vecs.Length; ++i)
{
WRange rx, ry, rz;
if (WRange.TryParse(parts[3 * i], out rx) && WRange.TryParse(parts[3 * i + 1], out ry) && WRange.TryParse(parts[3 * i + 2], out rz))
vecs[i] = new WVec(rx, ry, rz);
}
return vecs;
} }
return vecs; return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(WPos)) else if (fieldType == typeof(WPos))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length == 3)
{ {
WRange rx, ry, rz; var parts = value.Split(',');
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz)) if (parts.Length == 3)
return new WPos(rx, ry, rz); {
WRange rx, ry, rz;
if (WRange.TryParse(parts[0], out rx) && WRange.TryParse(parts[1], out ry) && WRange.TryParse(parts[2], out rz))
return new WPos(rx, ry, rz);
}
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
@@ -292,31 +313,38 @@ namespace OpenRA
} }
else if (fieldType == typeof(WRot)) else if (fieldType == typeof(WRot))
{ {
var parts = value.Split(','); if (value != null)
if (parts.Length == 3)
{ {
int rr, rp, ry; var parts = value.Split(',');
if (Exts.TryParseIntegerInvariant(value, out rr) if (parts.Length == 3)
&& Exts.TryParseIntegerInvariant(value, out rp) {
&& Exts.TryParseIntegerInvariant(value, out ry)) int rr, rp, ry;
return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry)); if (Exts.TryParseIntegerInvariant(value, out rr) && Exts.TryParseIntegerInvariant(value, out rp) && Exts.TryParseIntegerInvariant(value, out ry))
return new WRot(new WAngle(rr), new WAngle(rp), new WAngle(ry));
}
} }
return InvalidValueAction(value, fieldType, fieldName); return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(CPos)) else if (fieldType == typeof(CPos))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
return new CPos( {
Exts.ParseIntegerInvariant(parts[0]), var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Exts.ParseIntegerInvariant(parts[1])); return new CPos(Exts.ParseIntegerInvariant(parts[0]), Exts.ParseIntegerInvariant(parts[1]));
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(CVec)) else if (fieldType == typeof(CVec))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
return new CVec( {
Exts.ParseIntegerInvariant(parts[0]), var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Exts.ParseIntegerInvariant(parts[1])); return new CVec(Exts.ParseIntegerInvariant(parts[0]), Exts.ParseIntegerInvariant(parts[1]));
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType.IsEnum) else if (fieldType.IsEnum)
{ {
@@ -331,8 +359,10 @@ namespace OpenRA
} }
else if (fieldType == typeof(ImageFormat)) else if (fieldType == typeof(ImageFormat))
{ {
switch (value.ToLowerInvariant()) if (value != null)
{ {
switch (value.ToLowerInvariant())
{
case "bmp": case "bmp":
return ImageFormat.Bmp; return ImageFormat.Bmp;
case "gif": case "gif":
@@ -345,7 +375,10 @@ namespace OpenRA
return ImageFormat.Tiff; return ImageFormat.Tiff;
default: default:
return ImageFormat.Png; return ImageFormat.Png;
}
} }
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(bool)) else if (fieldType == typeof(bool))
return ParseYesNo(value, fieldType, fieldName); return ParseYesNo(value, fieldType, fieldName);
@@ -363,45 +396,66 @@ namespace OpenRA
} }
else if (fieldType == typeof(Size)) else if (fieldType == typeof(Size))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
return new Size( {
Exts.ParseIntegerInvariant(parts[0]), var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Exts.ParseIntegerInvariant(parts[1])); return new Size(Exts.ParseIntegerInvariant(parts[0]), Exts.ParseIntegerInvariant(parts[1]));
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(int2)) else if (fieldType == typeof(int2))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
return new int2( {
Exts.ParseIntegerInvariant(parts[0]), var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Exts.ParseIntegerInvariant(parts[1])); return new int2(Exts.ParseIntegerInvariant(parts[0]), Exts.ParseIntegerInvariant(parts[1]));
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(float2)) else if (fieldType == typeof(float2))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
float xx = 0; {
float yy = 0; var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
float res; float xx = 0;
if (float.TryParse(parts[0].Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res)) float yy = 0;
xx = res * (parts[0].Contains('%') ? 0.01f : 1f); float res;
if (float.TryParse(parts[1].Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res)) if (float.TryParse(parts[0].Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res))
yy = res * (parts[1].Contains('%') ? 0.01f : 1f); xx = res * (parts[0].Contains('%') ? 0.01f : 1f);
return new float2(xx, yy); if (float.TryParse(parts[1].Replace("%", ""), NumberStyles.Float, NumberFormatInfo.InvariantInfo, out res))
yy = res * (parts[1].Contains('%') ? 0.01f : 1f);
return new float2(xx, yy);
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType == typeof(Rectangle)) else if (fieldType == typeof(Rectangle))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
return new Rectangle( {
Exts.ParseIntegerInvariant(parts[0]), var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Exts.ParseIntegerInvariant(parts[1]), return new Rectangle(
Exts.ParseIntegerInvariant(parts[2]), Exts.ParseIntegerInvariant(parts[0]),
Exts.ParseIntegerInvariant(parts[3])); Exts.ParseIntegerInvariant(parts[1]),
Exts.ParseIntegerInvariant(parts[2]),
Exts.ParseIntegerInvariant(parts[3]));
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Bits<>)) else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Bits<>))
{ {
var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (value != null)
var argTypes = new Type[] { typeof(string[]) }; {
var argValues = new object[] { parts }; var parts = value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return fieldType.GetConstructor(argTypes).Invoke(argValues); var argTypes = new Type[] { typeof(string[]) };
var argValues = new object[] { parts };
return fieldType.GetConstructor(argTypes).Invoke(argValues);
}
return InvalidValueAction(value, fieldType, fieldName);
} }
else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>)) else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(Nullable<>))
{ {