forked from gitextensions/gitextensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCommitTemplateItem.cs
125 lines (107 loc) · 3.8 KB
/
CommitTemplateItem.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using GitCommands.Utils;
using JetBrains.Annotations;
namespace GitCommands
{
[Serializable]
public sealed class CommitTemplateItem : ISerializable
{
public string Name { get; set; }
public string Text { get; set; }
public Image Icon { get; set; }
public CommitTemplateItem(string name, string text, Image icon)
{
Name = name;
Text = text;
Icon = icon;
}
public CommitTemplateItem()
{
Name = string.Empty;
Text = string.Empty;
Icon = null;
}
private CommitTemplateItem(SerializationInfo info, StreamingContext context)
{
Name = (string)info.GetValue("Name", typeof(string));
Text = (string)info.GetValue("Text", typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Text", Text);
}
public static void SaveToSettings(CommitTemplateItem[] items)
{
string strVal = SerializeCommitTemplates(items);
AppSettings.CommitTemplates = strVal ?? string.Empty;
}
[CanBeNull]
public static CommitTemplateItem[] LoadFromSettings()
{
string serializedString = AppSettings.CommitTemplates;
var templates = DeserializeCommitTemplates(serializedString, out var shouldBeUpdated);
if (shouldBeUpdated)
{
SaveToSettings(templates);
}
return templates;
}
private static string SerializeCommitTemplates(CommitTemplateItem[] items)
{
return JsonSerializer.Serialize(items);
}
[CanBeNull]
private static CommitTemplateItem[] DeserializeCommitTemplates(string serializedString, out bool shouldBeUpdated)
{
shouldBeUpdated = false;
if (string.IsNullOrEmpty(serializedString))
{
return null;
}
CommitTemplateItem[] commitTemplateItem = null;
try
{
commitTemplateItem = JsonSerializer.Deserialize<CommitTemplateItem[]>(serializedString);
}
catch
{
// do nothing
}
if (commitTemplateItem == null)
{
try
{
int p = serializedString.IndexOf(':');
int length = Convert.ToInt32(serializedString.Substring(0, p));
byte[] memoryData = Convert.FromBase64String(serializedString.Substring(p + 1));
using (var rs = new MemoryStream(memoryData, 0, length))
{
var sf = new BinaryFormatter { Binder = new MoveNamespaceDeserializationBinder() };
commitTemplateItem = (CommitTemplateItem[])sf.Deserialize(rs);
}
shouldBeUpdated = true;
}
catch
{
return null;
}
}
return commitTemplateItem;
}
}
public sealed class MoveNamespaceDeserializationBinder : SerializationBinder
{
private const string OldNamespace = "GitUI.CommandsDialogs.CommitDialog";
private const string NewNamespace = "GitCommands";
public override Type BindToType(string assemblyName, string typeName)
{
typeName = typeName.Replace(OldNamespace, NewNamespace);
return Type.GetType($"{typeName}, {assemblyName}");
}
}
}