annotate ARClient/Form1.cs @ 0:90ea68d4f92f

First release
author Ivo Smits <Ivo@UCIS.nl>
date Sat, 08 Nov 2014 22:43:51 +0100
parents
children 27ccad26a830
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Collections.Generic;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.IO;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Text;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 using System.Windows.Forms;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 using UCIS.NaCl.v2;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 using UCIS.Util;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 namespace ARClient {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 partial class Form1 : Form {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public Boolean DatabaseSaved { get; set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 public String Database { get; private set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 public ed25519keypair SecretKey { get; set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 public MARCKey PublicKey { get; set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 public Dictionary<MARCLabel, MARCUpdate> Resources { get; private set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 public List<String> Peers { get; private set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 public List<MARCKey> BlockedKeys { get; private set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 public ResourceTypeFilter FilterFlags { get; set; }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 public enum ResourceTypeFilter : uint {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 AnonetIPv4 = 1,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 AnonetIPv6 = 2,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 AnonetDomain = 4,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 ASNumber= 8,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 OtherIPv4 = 16,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 OtherIPv6 = 32,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 OtherDomain = 64,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 Other = 128,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 Invalid = 256,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 Key = 512,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 None = 0,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 All = 0xffffffff,
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 public Form1() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 InitializeComponent();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 private void Form1_Load(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 DatabaseSaved = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 String dbpath = Path.Combine(Environment.CurrentDirectory, "marc.mdb");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 if (!File.Exists(dbpath) || !LoadDatabase(dbpath)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 MessageBox.Show("The standard database could not be loaded. The system will now generate a new key pair. If you already have a key pair and want to use it, make sure to import the key file or open the existing database.", "MARC - New database", MessageBoxButtons.OK, MessageBoxIcon.Information);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 CreateDatabase();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 if (!File.Exists(dbpath)) Database = dbpath;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 cmbResourceFilter.SelectedIndex = 0;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 public void UpdatePeersList() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 synchronizeResourcesToolStripMenuItem.DropDownItems.Clear();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 ToolStripItem item = synchronizeResourcesToolStripMenuItem.DropDownItems.Add("All peers");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 item.Tag = null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 item.Click += SynchronizeServerToolStripMenuItem_Click;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 foreach (String peer in Peers) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 item = synchronizeResourcesToolStripMenuItem.DropDownItems.Add(peer);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 item.Tag = peer;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 item.Click += SynchronizeServerToolStripMenuItem_Click;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 internal Boolean IsResourceFiltered(MARCUpdate update) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 if (BlockedKeys.Contains(update.Key)) return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 Byte[] label = update.Label.Bytes;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 if (label == null || label.Length < 1) return 0 != (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 switch (label[0]) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 case 0:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 if (label.Length != 33 || !ArrayUtil.Equal(ArrayUtil.Slice(label, 1), update.Key.Bytes)) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 return 0 == (FilterFlags & ResourceTypeFilter.Key);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 case 1:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 if (label.Length != 6) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 if (label[5] > 32) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 if (label[1] == 1) return 0 == (FilterFlags & ResourceTypeFilter.AnonetIPv4);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 return 0 == (FilterFlags & ResourceTypeFilter.OtherIPv4);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 case 2:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 if (label.Length != 18) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 if (label[17] > 128) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 if (label[1] == 0xfc || label[1] == 0xfd) return 0 == (FilterFlags & ResourceTypeFilter.AnonetIPv6);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 return 0 == (FilterFlags & ResourceTypeFilter.OtherIPv6);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 case 3:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 if (label.Length != 5) return 0 == (FilterFlags & ResourceTypeFilter.Invalid);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 return 0 == (FilterFlags & ResourceTypeFilter.ASNumber);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 case 4:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 String dom = Encoding.UTF8.GetString(label, 1, label.Length - 1);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 if (dom.EndsWith(".ano")) return 0 == (FilterFlags & ResourceTypeFilter.AnonetDomain);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 return 0 == (FilterFlags & ResourceTypeFilter.OtherDomain);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 default:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 return 0 == (FilterFlags & ResourceTypeFilter.Other);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 public void GenerateKeyPair() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 if (DialogResult.Yes != MessageBox.Show(this, "Generating a new key pair will erase your old key pair from the local database. If you lose your key you will no longer be able to update your resource claims. Please make sure that you either have a backup of your key, or have no claims! Do you want to continue?", "MARC - Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 if (DialogResult.Yes != MessageBox.Show(this, "Are you really sure you want to overwrite your key? There is no way back! Did you make a backup?", "MARC - Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 SecretKey = new ed25519keypair();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 PublicKey = new MARCKey(SecretKey.PublicKey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 DatabaseSaved = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 #region "Database UI stuff"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 private Boolean WarnDatabaseSaved() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 if (DatabaseSaved) return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 return DialogResult.Yes == MessageBox.Show(this, "The current database is not saved. You may lose data if you continue. Losing your key pair will render your unable to update your resources. Are you sure you want to continue?", "MARC - Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 private Boolean SaveDatabase() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 if (Database == null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 return SaveDatabaseAs();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 return SaveDatabase(Database);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 private Boolean SaveDatabaseAs() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 SaveFileDialog dialog = new SaveFileDialog();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 dialog.OverwritePrompt = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 dialog.Title = "MARC - Save database file";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 SetupFileDialog(dialog);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 if (dialog.ShowDialog(this) != DialogResult.OK) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 return SaveDatabase(dialog.FileName);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 private String SelectDatabaseOpen(String title) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 OpenFileDialog dialog = new OpenFileDialog();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 dialog.Multiselect = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 dialog.ShowReadOnly = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 dialog.CheckFileExists = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 dialog.Title = "MARC - " + title;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 SetupFileDialog(dialog);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 if (dialog.ShowDialog(this) != DialogResult.OK) return null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 return dialog.FileName;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 private void SetupFileDialog(FileDialog dialog) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 dialog.AddExtension = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 dialog.CheckPathExists = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 dialog.DefaultExt = "mdb";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 dialog.DereferenceLinks = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 dialog.FileName = Database;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 dialog.Filter = "MARC Database files (*.mdb)|*.mdb|All files (*.*)|*.*";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 dialog.InitialDirectory = Database == null ? Environment.CurrentDirectory : Path.GetDirectoryName(Database);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 dialog.SupportMultiDottedExtensions = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 dialog.ValidateNames = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 if (DatabaseSaved) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 switch (MessageBox.Show(this, "The current database has not been saved. Losing your key pair may render you unable to update your resources! Do you want to save the database?", "MARC - Warning", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 case DialogResult.Yes:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 if (!SaveDatabase()) e.Cancel = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 case DialogResult.No:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 case DialogResult.Cancel:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 e.Cancel = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 #region "Database file"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 private Boolean LoadDatabase(String fn) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 if (!WarnDatabaseSaved()) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 try {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 lstResources.BeginUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 lstResources.Sorted = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 using (FileStream fs = File.OpenRead(fn)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 BinaryReader br = new BinaryReader(fs, Encoding.UTF8);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 if (br.ReadString() != "MARC") throw new Exception("This file is not a MARC database");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 Byte version = br.ReadByte();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 Resources = new Dictionary<MARCLabel, MARCUpdate>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 Peers = new List<string>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 BlockedKeys = new List<MARCKey>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 FilterFlags = ResourceTypeFilter.All;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 lstResources.Items.Clear();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 if (version == 2) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 SecretKey = new ed25519keypair(br.ReadBytes(32));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 PublicKey = new MARCKey(SecretKey.PublicKey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 Int32 c = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 for (int i = 0; i < c; i++) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 Int32 len = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 if (len == 0) continue;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 ImportUpdate(br.ReadBytes(len), true);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 c = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 for (int i = 0; i < c; i++) Peers.Add(br.ReadString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 c = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 for (int i = 0; i < c; i++) BlockedKeys.Add(new MARCKey(br.ReadBytes(32)));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 FilterFlags = (ResourceTypeFilter)br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 } else if (version == 3) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 UInt32 len = Functions.FromBigEndian((UInt32)br.ReadInt32());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 Byte[] metabytes = br.ReadBytes((int)len);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 IDictionary metadata = MARCUpdate.DecodeValue(metabytes) as IDictionary;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 if (metadata != null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 if (metadata["keys"] != null)
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 foreach (IDictionary metakey in (IList)metadata["keys"]) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 if (!metakey.Contains("key")) continue;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 SecretKey = new ed25519keypair(((BinaryString)metakey["key"]).Bytes);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 PublicKey = new MARCKey(SecretKey.PublicKey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 if (metadata["peers"] != null)
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 foreach (IDictionary metapeer in (IList)metadata["peers"])
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 Peers.Add(metapeer["address"].ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 if (metadata["blockedkeys"] != null)
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 foreach (BinaryString metablockedkey in (IList)metadata["blockedkeys"])
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 BlockedKeys.Add(new MARCKey(metablockedkey.Bytes));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 if (metadata["filterflags"] != null)
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 FilterFlags = (ResourceTypeFilter)Functions.DecodeInt32BigEndian(((BinaryString)metadata["filterflags"]).Bytes, 0);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 while (true) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 Byte[] lenbytes = br.ReadBytes(4);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 if (lenbytes.Length == 0) break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 if (lenbytes.Length != 4) throw new Exception("Database truncated");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 len = Functions.DecodeInt32BigEndian(lenbytes, 0);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 ImportUpdate(br.ReadBytes((int)len), true);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 throw new Exception("Unsupported database version");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 br.Close();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 Database = fn;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 DatabaseSaved = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 UpdatePeersList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 } catch (Exception ex) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 Console.Error.WriteLine(ex.ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 MessageBox.Show(this, "Failed to load the database: " + ex.Message, "MARC - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 } finally {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 lstResources.Sorted = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 lstResources.EndUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 private Boolean ImportDatabase(String fn) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 try {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 lstResources.BeginUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 lstResources.Sorted = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 using (FileStream fs = File.OpenRead(fn)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 BinaryReader br = new BinaryReader(fs, Encoding.UTF8);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 if (br.ReadString() != "MARC") throw new Exception("This file is not a MARC database");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 Byte version = br.ReadByte();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 if (version == 2) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 br.ReadBytes(32);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 Int32 c = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 for (int i = 0; i < c; i++) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 Int32 len = br.ReadInt32();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 if (len == 0) continue;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 ImportUpdate(br.ReadBytes(len), false);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 } else if (version == 3) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 UInt32 len = Functions.FromBigEndian((UInt32)br.ReadInt32());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 br.ReadBytes((int)len);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 while (true) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 Byte[] lenbytes = br.ReadBytes(4);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 if (lenbytes.Length == 0) break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 if (lenbytes.Length != 4) throw new Exception("Database truncated");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 len = Functions.DecodeInt32BigEndian(lenbytes, 0);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 ImportUpdate(br.ReadBytes((int)len), false);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 throw new Exception("Unsupported database version");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 br.Close();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 } catch (Exception ex) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 Console.Error.WriteLine(ex.ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 MessageBox.Show(this, "Failed to import the database: " + ex.Message, "MARC - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 } finally {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 lstResources.Sorted = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 lstResources.EndUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 private Boolean SaveDatabase(String fn) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 try {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 if (File.Exists(fn) && fn != Database) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 if (DialogResult.No == MessageBox.Show(this, "The file " + fn + " exists. Are you sure you want to overwrite it?", "MARC - Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 String tempfile = Path.GetTempFileName();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 using (FileStream fs = File.Create(tempfile)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 BinaryWriter wr = new BinaryWriter(fs, Encoding.UTF8);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 wr.Write("MARC");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 wr.Write((Byte)3); //Version
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 Hashtable metadata = new Hashtable();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 ArrayList metakeys = new ArrayList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 Hashtable metakey = new Hashtable();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 metakey.Add("key", SecretKey.SecretKey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 metakeys.Add(metakey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 metadata.Add("keys", metakeys);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 ArrayList metapeers = new ArrayList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 foreach (String peer in Peers) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 Hashtable metapeer = new Hashtable();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 metapeer.Add("address", peer);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 metapeers.Add(metapeer);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 metadata.Add("peers", metapeers);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 ArrayList metablockedkeys = new ArrayList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 foreach (MARCKey peer in BlockedKeys) metablockedkeys.Add(peer.Bytes);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311 metadata.Add("blockedkeys", metablockedkeys);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 metadata.Add("filterflags", Functions.EncodeInt32BigEndian((uint)FilterFlags));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 Byte[] metabytes = MARCUpdate.EncodeValue(metadata);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 wr.Write(Functions.EncodeInt32BigEndian((uint)metabytes.Length));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 wr.Write(metabytes);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
316 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
317 lock (Resources) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 foreach (MARCUpdate update in Resources.Values) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319 Byte[] message = update.UpdateMessage;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
320 if (message == null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 wr.Write((Int32)0);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
322 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 wr.Write((Int32)Functions.ToBigEndian((UInt32)message.Length));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
324 wr.Write(message);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
325 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
326 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
328 wr.Close();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 File.Delete(fn);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330 File.Move(tempfile, fn);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 Database = fn;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 DatabaseSaved = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 } catch (Exception ex) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 Console.Error.WriteLine(ex.ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 MessageBox.Show(this, "Failed to save the database: " + ex.Message, "MARC - Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 #region "Other database management"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 private void CreateDatabase() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 if (!WarnDatabaseSaved()) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
346 Database = null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 SecretKey = new ed25519keypair();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
348 PublicKey = new MARCKey(SecretKey.PublicKey);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
349 Resources = new Dictionary<MARCLabel, MARCUpdate>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
350 Peers = new List<string>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
351 BlockedKeys = new List<MARCKey>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
352 FilterFlags = ResourceTypeFilter.All & ~ResourceTypeFilter.Invalid;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
353 Peers.Add("http://marc.ucis.ano/");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
354 lstResources.Items.Clear();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
355 UpdatePeersList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356 DatabaseSaved = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358 public Boolean ImportUpdate(Byte[] update, Boolean quick) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 try {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360 MARCUpdate resource = MARCUpdate.Decode(update);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 MARCLabel label = resource.Label;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 MARCUpdate current;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 if (!quick && IsResourceFiltered(resource)) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 lock (Resources) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 if (Resources.TryGetValue(label, out current)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 if (current.Serial >= resource.Serial) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 if (!current.CanUpdate(resource.Key)) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 if (!quick && resource.Value == null) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 if (!quick && resource.Expired) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 current = null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 if (!quick && !resource.VerifySignature()) return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 DatabaseSaved = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 Resources[label] = resource;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 if (InvokeRequired) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 Invoke((MethodInvoker)delegate() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 ResourceHasChanged(resource, current);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 });
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382 ResourceHasChanged(resource, current);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
383 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384 return true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 } catch (Exception ex) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 Console.Error.WriteLine(ex.ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387 return false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
390 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
391
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 public void ReplaceOrAddResource(MARCUpdate newres) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 MARCUpdate old;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 lock (Resources) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 if (!Resources.TryGetValue(newres.Label, out old)) old = null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 Resources[newres.Label] = newres;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 ResourceHasChanged(newres, old);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 public void ResourceHasChanged(MARCUpdate newres, MARCUpdate oldres) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 Boolean selected = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 if (oldres != null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403 selected = lstResources.SelectedItem == oldres;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 lstResources.Items.Remove(oldres);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 if (newres != null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 AddResourceToListFiltered(newres);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 if (selected) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 lstResources.SelectedItem = newres;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 ShowResourceDetails(newres);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 #region "Resource list box"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 private void cmbResourceFilter_SelectedIndexChanged(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 RefreshResourceList();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 public void RefreshResourceList() {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 lstResources.BeginUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 lstResources.Sorted = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 lstResources.Items.Clear();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 lock (Resources) foreach (MARCUpdate update in Resources.Values) AddResourceToListFiltered(update);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 lstResources.Sorted = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 lstResources.EndUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 private void AddResourceToListFiltered(MARCUpdate update) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 switch (cmbResourceFilter.SelectedIndex) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 case 1: //My resources
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 if (update.Key != PublicKey) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 case 2: //Filtered items
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 if (!IsResourceFiltered(update)) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
435 case 3: //Expired items
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436 if (!update.Expired) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 case 4: //Domain names
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 if (update.Label.Bytes.Length < 1 || update.Label.Bytes[0] != 4) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
441 case 5: //IPv4 networks
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 if (update.Label.Bytes.Length != 6 || update.Label.Bytes[0] != 1) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
443 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
444 case 6: //IPv6 networks
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
445 if (update.Label.Bytes.Length != 18 || update.Label.Bytes[0] != 2) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 case 7: //AS numbers
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448 if (update.Label.Bytes.Length != 5 || update.Label.Bytes[0] != 3) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450 case 8: //Key info
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 if (update.Label.Bytes.Length != 33 || update.Label.Bytes[0] != 0) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 case 0: //All resources
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454 default:
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 break;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 lstResources.Items.Add(update);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
458 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
459 private void lstResources_SelectedIndexChanged(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
460 if (lstResources.SelectedItem == null) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
461 ShowResourceDetails((MARCUpdate)lstResources.SelectedItem);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
462 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
463 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
464
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
465 #region "Resource details area"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
466 private void ShowResourceDetails(MARCUpdate update) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
467 txtResourceKey.Text = update.Key.ToString();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
468 txtResourceLabel.Text = update.Label.ToString();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
469 txtResourceSerial.Text = update.Serial.ToString();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
470 UInt32 tsnow = checked((UInt32)(DateTime.UtcNow - (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))).TotalSeconds);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
471 UInt32 tslastyear = tsnow - 365 * 24 * 60 * 60;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
472 String[] flags = null;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
473 if (PublicKey == update.Key) UCIS.Util.ArrayUtil.Add(ref flags, "Owned");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
474 else if (update.CanUpdate(PublicKey)) UCIS.Util.ArrayUtil.Add(ref flags, "Transferable");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
475 if (update.Expired) UCIS.Util.ArrayUtil.Add(ref flags, "Expired");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
476 if (flags == null || flags.Length == 0) UCIS.Util.ArrayUtil.Add(ref flags, "Claimed");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
477 txtResourceStatus.Text = String.Join(", ", flags);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
478 lvwResourceValue.SuspendLayout();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
479 lvwResourceValue.Nodes.Clear();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
480
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
481 if (update.Value is IDictionary) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
482 foreach (DictionaryEntry child in (IDictionary)update.Value) lvwResourceValue.Nodes.Add(AddResourceValueInTree(child.Key.ToString() + ": ", child.Value));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
483 } else if (update.Value is ICollection) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
484 foreach (Object child in (ICollection)update.Value) lvwResourceValue.Nodes.Add(AddResourceValueInTree(String.Empty, child));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
485 } else if (update.Value == null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
486 lvwResourceValue.Nodes.Add("Null");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
487 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
488 lvwResourceValue.Nodes.Add(update.Value.ToString());
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
489 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
490
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
491 lvwResourceValue.ResumeLayout();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
492 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
493 private TreeNode AddResourceValueInTree(String prefix, Object value) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
494 TreeNode node = new TreeNode();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
495 if (value is IDictionary) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
496 node.Text = prefix + "Dictionary";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
497 foreach (DictionaryEntry child in (IDictionary)value) node.Nodes.Add(AddResourceValueInTree(child.Key.ToString() + ": ", child.Value));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
498 } else if (value is ICollection) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
499 node.Text = prefix + "Collection";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
500 foreach (Object child in (ICollection)value) node.Nodes.Add(AddResourceValueInTree(String.Empty, child));
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
501 } else if (value == null) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
502 node.Text = prefix + "Null";
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
503 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
504 node.Text = prefix + value.ToString();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
505 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
506 node.Expand();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
507 return node;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
508 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
509 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
510
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
511 #region "Menu bar"
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
512 private void settingsToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
513 frmSettings form = new frmSettings();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
514 form.MainForm = this;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
515 form.ShowDialog(this);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
516 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
517
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
518 public void newDatabaseToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
519 CreateDatabase();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
520 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
521 public void reloadDatabaseToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
522 if (Database == null || !File.Exists(Database)) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
523 openDatabaseToolStripMenuItem_Click(sender, e);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
524 } else {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
525 LoadDatabase(Database);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
526 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
527 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
528 public void saveDatabaseToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
529 SaveDatabase();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
530 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
531 public void saveDatabaseAsToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
532 SaveDatabaseAs();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
533 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
534 public void openDatabaseToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
535 String fn = SelectDatabaseOpen("Open database");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
536 if (fn == null) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
537 LoadDatabase(fn);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
538 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
539 public void importDatabaseToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
540 String fn = SelectDatabaseOpen("Open database");
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
541 if (fn == null) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
542 ImportDatabase(fn);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
543 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
544 private void SynchronizeServerToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
545 ToolStripMenuItem tsi = sender as ToolStripMenuItem;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
546 frmSync form = new frmSync();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
547 form.MainForm = this;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
548 form.Hosts = (tsi == null || tsi.Tag == null) ? (IEnumerable<String>)Peers : new String[] { tsi.Tag.ToString() };
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
549 form.ShowDialog(this);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
550 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
551
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
552 private void deleteSelectedToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
553 MessageBox.Show(this, "This will delete the resources only from the local database. It may be retrieved again during synchronization.", "MARC - Delete resource", MessageBoxButtons.OK, MessageBoxIcon.Information);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
554 List<MARCUpdate> ToDelete = new List<MARCUpdate>();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
555 foreach (Object item in lstResources.SelectedItems) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
556 MARCUpdate update = (MARCUpdate)item;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
557 if (Resources.Remove(update.Label)) ToDelete.Add(update);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
558 DatabaseSaved = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
559 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
560 lstResources.BeginUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
561 lstResources.Sorted = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
562 foreach (MARCUpdate item in ToDelete) ResourceHasChanged(null, item);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
563 lstResources.Sorted = true;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
564 lstResources.EndUpdate();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
565 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
566
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
567 private void addKeyToFilterListToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
568 if (lstResources.SelectedItems.Count == 0) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
569 foreach (Object item in lstResources.SelectedItems) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
570 MARCUpdate update = (MARCUpdate)item;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
571 if (BlockedKeys.Contains(update.Key)) continue;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
572 BlockedKeys.Add(update.Key);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
573 DatabaseSaved = false;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
574 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
575 MessageBox.Show(this, "The selected key has been added to the filter list. Use the Settings window to delete all filtered items from the local database.", "MARC - Key filter", MessageBoxButtons.OK, MessageBoxIcon.Information);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
576 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
577
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
578 private void addNewToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
579 frmEditResource form = new frmEditResource();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
580 form.MainForm = this;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
581 form.ShowDialog(this);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
582 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
583
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
584 private void editSelectedToolStripMenuItem_Click(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
585 MARCUpdate resource = lstResources.SelectedItem as MARCUpdate;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
586 if (resource == null) return;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
587 frmEditResource form = new frmEditResource();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
588 form.MainForm = this;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
589 form.Label = resource.Label.Bytes;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
590 form.Value = resource.Value as IDictionary;
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
591 form.ImportData();
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
592 form.ShowDialog(this);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
593 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
594 #endregion
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
595
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
596 private void lstResources_DoubleClick(object sender, EventArgs e) {
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
597 editSelectedToolStripMenuItem_Click(sender, e);
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
598 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
599 }
90ea68d4f92f First release
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
600 }