mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-02-04 13:45:40 +00:00
Compare commits
1018 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1da5f192c | ||
|
|
c15809dd72 | ||
|
|
89a67d1bd2 | ||
|
|
c4c6709478 | ||
|
|
5e1f6ac4b3 | ||
|
|
8f8d86d0bb | ||
|
|
ecca11e2f3 | ||
|
|
527b09c6bc | ||
|
|
69b6595434 | ||
|
|
59b918c75f | ||
|
|
344132b50a | ||
|
|
a35e58e9cc | ||
|
|
4300d94858 | ||
|
|
ee85a84d8f | ||
|
|
2959d82231 | ||
|
|
5dfe6aefb0 | ||
|
|
7f7d0f84ef | ||
|
|
4bfaf36e24 | ||
|
|
695fc4b0af | ||
|
|
f16ed9742f | ||
|
|
6bfe68b8cf | ||
|
|
2e5c5b3c79 | ||
|
|
2a6e193756 | ||
|
|
65a86d87f0 | ||
|
|
d7131dfa4c | ||
|
|
a228b16314 | ||
|
|
b8c9048ac6 | ||
|
|
0b54350d59 | ||
|
|
59eddb7129 | ||
|
|
1096232f9d | ||
|
|
4b39ee8d00 | ||
|
|
27a9b12bbf | ||
|
|
11319c3341 | ||
|
|
4de061e0d1 | ||
|
|
258e894c30 | ||
|
|
8658eaf4e0 | ||
|
|
6d341abc75 | ||
|
|
4821d63b4a | ||
|
|
0617bf3170 | ||
|
|
425d13a2ac | ||
|
|
8a1e90f537 | ||
|
|
ddc00948ed | ||
|
|
c96ee81f06 | ||
|
|
f6201e2c35 | ||
|
|
d63fcfcf7f | ||
|
|
dcc50c4c23 | ||
|
|
60e46e580d | ||
|
|
0638998773 | ||
|
|
ad3113987b | ||
|
|
f2f0d0f2e7 | ||
|
|
f7fd2f6f65 | ||
|
|
281c18e21d | ||
|
|
1a9c8b5392 | ||
|
|
831a272f4b | ||
|
|
f47e68b9ba | ||
|
|
eaabd2ee77 | ||
|
|
a269edd6ea | ||
|
|
3bb501ce0c | ||
|
|
d0006a4653 | ||
|
|
c48a1394bc | ||
|
|
fcf7fcfd44 | ||
|
|
cca08e7103 | ||
|
|
b908732f5c | ||
|
|
4ee4a6e85f | ||
|
|
7990f11bab | ||
|
|
427f7c9136 | ||
|
|
f938f1593d | ||
|
|
480a1834ed | ||
|
|
df5acc648c | ||
|
|
10569e6aa1 | ||
|
|
e5103b4830 | ||
|
|
513646fc53 | ||
|
|
27f723bf2f | ||
|
|
6511ecb5ad | ||
|
|
7bf6e6f344 | ||
|
|
d3e340ae39 | ||
|
|
22167a9617 | ||
|
|
48bea55133 | ||
|
|
42239919e5 | ||
|
|
4840d9df6e | ||
|
|
1378b87ea6 | ||
|
|
6b48164b97 | ||
|
|
50b09aa249 | ||
|
|
ecbd147f6d | ||
|
|
c13df79848 | ||
|
|
48bcc1de5b | ||
|
|
d082f5de25 | ||
|
|
c2321669b6 | ||
|
|
e382635b85 | ||
|
|
b4e02d7f8c | ||
|
|
0dc8a0b6c0 | ||
|
|
171834986d | ||
|
|
97af686b73 | ||
|
|
7d627ffc6f | ||
|
|
d924f25eb2 | ||
|
|
abd8ef3b1f | ||
|
|
e9b8dba3a6 | ||
|
|
aaff7e7332 | ||
|
|
2fa00d1a16 | ||
|
|
8a2a2ecd12 | ||
|
|
98517bdd8c | ||
|
|
dfe76f7e7e | ||
|
|
a2e24b1f5f | ||
|
|
6a4e76e245 | ||
|
|
1ebec97e0e | ||
|
|
b9f03b02f0 | ||
|
|
2c06760778 | ||
|
|
3f0ee70b71 | ||
|
|
05b34f158b | ||
|
|
e08db935b4 | ||
|
|
47da068bd3 | ||
|
|
9de669606d | ||
|
|
a02d50e61d | ||
|
|
069dab7fba | ||
|
|
d65edadbbb | ||
|
|
6307a51c0a | ||
|
|
d27c602bdf | ||
|
|
59fe9cb113 | ||
|
|
b4b7ba75cb | ||
|
|
d02e0c16c4 | ||
|
|
4aa0eb54b7 | ||
|
|
c4f73abcb6 | ||
|
|
73dec51a4d | ||
|
|
b7c3c094ae | ||
|
|
97702ab3d5 | ||
|
|
a9b5fe706c | ||
|
|
198d48610c | ||
|
|
c0e0344914 | ||
|
|
d49b2f1b60 | ||
|
|
ec7172466b | ||
|
|
d75a512ead | ||
|
|
af8b6906b6 | ||
|
|
96bc301e6d | ||
|
|
c10749f34d | ||
|
|
0e4235c8ba | ||
|
|
b2d31bb87e | ||
|
|
3ee88793da | ||
|
|
ad0f01c3ef | ||
|
|
63a96a7cf8 | ||
|
|
b8d8ca9a5c | ||
|
|
6b0fca31ae | ||
|
|
c147b12b10 | ||
|
|
7884b0b775 | ||
|
|
9f3c263328 | ||
|
|
b830ce3d73 | ||
|
|
e8b7f33bf0 | ||
|
|
eae75c5943 | ||
|
|
c1f5ebcae1 | ||
|
|
acb8e98fe2 | ||
|
|
a24a92e97c | ||
|
|
f2d2fe97bb | ||
|
|
705252eec7 | ||
|
|
69ae0456f0 | ||
|
|
f07bd07cce | ||
|
|
9db2d2ca05 | ||
|
|
85248b0135 | ||
|
|
8663edc7df | ||
|
|
b9cc9e40fd | ||
|
|
5ce085ad2b | ||
|
|
d24f8a2fce | ||
|
|
a73e830209 | ||
|
|
146fb42fd0 | ||
|
|
5b54ed719e | ||
|
|
02d011228e | ||
|
|
07adfd20a3 | ||
|
|
1d00abd6cc | ||
|
|
36c2cc2f15 | ||
|
|
27cf01ce84 | ||
|
|
1e94163693 | ||
|
|
db1f94775b | ||
|
|
ce394eb4e9 | ||
|
|
15109bed88 | ||
|
|
8a18c8de34 | ||
|
|
2f093a80c7 | ||
|
|
5df1af9c17 | ||
|
|
d5ab37a5a6 | ||
|
|
ed9ecf0da9 | ||
|
|
4fc17197ca | ||
|
|
94a9cf0c3f | ||
|
|
1d9e12183f | ||
|
|
aaa8bbe709 | ||
|
|
805d1b9ad8 | ||
|
|
d24d3e5adb | ||
|
|
d3a7d552c3 | ||
|
|
9f1c5e2bd2 | ||
|
|
1ec4ea8354 | ||
|
|
e4fab52489 | ||
|
|
e029fa4833 | ||
|
|
2c3f229a6a | ||
|
|
3558d3532c | ||
|
|
ad5314dc22 | ||
|
|
eaa5bb5662 | ||
|
|
fcdc703595 | ||
|
|
ef9fa562ab | ||
|
|
ac285c48fe | ||
|
|
e57ad65210 | ||
|
|
0fc3a30422 | ||
|
|
49f6704694 | ||
|
|
6df712c538 | ||
|
|
bda3076a30 | ||
|
|
89e8e7c706 | ||
|
|
c10835d221 | ||
|
|
a6801350ea | ||
|
|
c7a5a62041 | ||
|
|
749b35e5cb | ||
|
|
3c520d33eb | ||
|
|
635170a051 | ||
|
|
9619311d11 | ||
|
|
4bee14835c | ||
|
|
f44059e16a | ||
|
|
bfb206a06d | ||
|
|
6b7b05eb31 | ||
|
|
a9a2a04332 | ||
|
|
50459645dd | ||
|
|
564386038f | ||
|
|
9f229aad47 | ||
|
|
f6f6ea21b4 | ||
|
|
ec416d5631 | ||
|
|
335cbca8fb | ||
|
|
ab8d5ec475 | ||
|
|
ef9f050fbf | ||
|
|
46b1838d72 | ||
|
|
2b9a527743 | ||
|
|
cb41f8a8a6 | ||
|
|
fcf003af7d | ||
|
|
350924545c | ||
|
|
ae6bf0f2da | ||
|
|
7395d9842c | ||
|
|
741a1e13d0 | ||
|
|
447064afc1 | ||
|
|
a443a6833a | ||
|
|
160239eba7 | ||
|
|
04fb3fd363 | ||
|
|
ba60c9b516 | ||
|
|
f8ddfcf5ae | ||
|
|
c379bdcadc | ||
|
|
575caeda92 | ||
|
|
0d4dcf4a60 | ||
|
|
ddb14a69d0 | ||
|
|
f1ace61076 | ||
|
|
0f5f866cd2 | ||
|
|
bd866c5b05 | ||
|
|
07ea1abbf8 | ||
|
|
6853376f60 | ||
|
|
0e67f0bff4 | ||
|
|
6035c19f47 | ||
|
|
592a3d3505 | ||
|
|
2c092ed665 | ||
|
|
2bd4a00df4 | ||
|
|
f0639b28b9 | ||
|
|
775bab6656 | ||
|
|
c82d865cd5 | ||
|
|
0b95b9509a | ||
|
|
d8185e3970 | ||
|
|
b3a3766d77 | ||
|
|
3681682fe8 | ||
|
|
12c292d038 | ||
|
|
5af4de2878 | ||
|
|
2e7f18c407 | ||
|
|
48248b2832 | ||
|
|
c6082fa7c7 | ||
|
|
3af19510a8 | ||
|
|
2a12b8132f | ||
|
|
3daec985ba | ||
|
|
4b79ee103c | ||
|
|
077abd590a | ||
|
|
cab890b1d9 | ||
|
|
d3f0858ec4 | ||
|
|
97896b91d7 | ||
|
|
ca354b3b7f | ||
|
|
d035211a64 | ||
|
|
75728a4d1d | ||
|
|
265789ea84 | ||
|
|
4577311432 | ||
|
|
963c333c2e | ||
|
|
6eff6cf3b6 | ||
|
|
c9794691bb | ||
|
|
9574232719 | ||
|
|
676bf584d6 | ||
|
|
0a4fd01ede | ||
|
|
6cb4023498 | ||
|
|
8f775dbb3b | ||
|
|
91785eab1f | ||
|
|
4f8751667a | ||
|
|
ad7508c464 | ||
|
|
97a9e141ae | ||
|
|
842a0c3daf | ||
|
|
b6acde9145 | ||
|
|
b97dbc2ac5 | ||
|
|
e03852bd7e | ||
|
|
0db5de204e | ||
|
|
5fe3f14419 | ||
|
|
ffe1d9a82d | ||
|
|
11d6560290 | ||
|
|
e29d8e6728 | ||
|
|
918e81a4cb | ||
|
|
ad0ddede38 | ||
|
|
e969b12884 | ||
|
|
7a5475255f | ||
|
|
0ffd436de8 | ||
|
|
4f685187e9 | ||
|
|
2b356b37b1 | ||
|
|
7c56268eb1 | ||
|
|
970a54e6e3 | ||
|
|
e35ddf0780 | ||
|
|
bf35b7c10b | ||
|
|
4026b8ca09 | ||
|
|
6d2e2d8c3b | ||
|
|
a2b08157cc | ||
|
|
0108ecf4c1 | ||
|
|
4921da0bb5 | ||
|
|
0c836bb3b1 | ||
|
|
a8e41c1505 | ||
|
|
f67e1c9d2b | ||
|
|
f0ce58a79e | ||
|
|
b7f782c1b7 | ||
|
|
5e39e169b2 | ||
|
|
104c5ccad4 | ||
|
|
d15b4d7d23 | ||
|
|
60e6a75d5e | ||
|
|
484415d0e5 | ||
|
|
0ef9b447c4 | ||
|
|
8f64e2defd | ||
|
|
fbdadce129 | ||
|
|
d3e7abfaa3 | ||
|
|
b2279e97b2 | ||
|
|
7cf969336f | ||
|
|
f73d48166a | ||
|
|
53af618fe4 | ||
|
|
5d2cf58477 | ||
|
|
664e7dce28 | ||
|
|
14a8f00864 | ||
|
|
0b889fdc06 | ||
|
|
e336efc149 | ||
|
|
4cd52162eb | ||
|
|
eab9fff711 | ||
|
|
d4f3511060 | ||
|
|
ed12bbb35c | ||
|
|
aa4629fe99 | ||
|
|
1950f23cf4 | ||
|
|
ca7c88cef6 | ||
|
|
10848e6c51 | ||
|
|
f5d0f065c1 | ||
|
|
17b0573b0b | ||
|
|
7f1d843d96 | ||
|
|
cc4837c1d1 | ||
|
|
588ee5bfe4 | ||
|
|
e9b1b2750f | ||
|
|
1d6fa06e97 | ||
|
|
2c22924239 | ||
|
|
eb01dd1e25 | ||
|
|
0a3cb79b1c | ||
|
|
da9eace8cc | ||
|
|
526a02b8b6 | ||
|
|
658c7a1c3b | ||
|
|
af84474795 | ||
|
|
42913c6732 | ||
|
|
2cdf544518 | ||
|
|
652ec58238 | ||
|
|
f8531daa5c | ||
|
|
e9e89b0b43 | ||
|
|
55e788a894 | ||
|
|
b28bb93ccb | ||
|
|
367aab0f83 | ||
|
|
9dcf3b9e0a | ||
|
|
3c514110ce | ||
|
|
c9b0c2dace | ||
|
|
d575b6977e | ||
|
|
a00e6a5e2d | ||
|
|
1b9ae83e8c | ||
|
|
8b91eb1caf | ||
|
|
2a6a7b5e9a | ||
|
|
a85943866e | ||
|
|
797fb519c1 | ||
|
|
3ba9d56363 | ||
|
|
04cd4e4056 | ||
|
|
348e170654 | ||
|
|
f5a4ca6276 | ||
|
|
672c010aa7 | ||
|
|
2459d88951 | ||
|
|
350d1c8d31 | ||
|
|
98a3842a3e | ||
|
|
b52a4469ee | ||
|
|
e3143e21ba | ||
|
|
1bf2181fd3 | ||
|
|
1460635aab | ||
|
|
935ec00c86 | ||
|
|
473b6de09b | ||
|
|
ba75f2ac2c | ||
|
|
a230b39fbc | ||
|
|
8e963ac62a | ||
|
|
eaaa89847d | ||
|
|
ef76166978 | ||
|
|
72912586a1 | ||
|
|
fb241a4036 | ||
|
|
368c8b0533 | ||
|
|
4010325e65 | ||
|
|
11dd75ad95 | ||
|
|
d0480a1311 | ||
|
|
2be33b845d | ||
|
|
2ad42e3a0f | ||
|
|
5d1f83800b | ||
|
|
30e89a7943 | ||
|
|
61f5dc4cf2 | ||
|
|
d056c179ed | ||
|
|
b9c4bfc67e | ||
|
|
6ab5ee0ae0 | ||
|
|
94c1a86702 | ||
|
|
af6dd6a7fc | ||
|
|
45d4926d4c | ||
|
|
ce016c5eb0 | ||
|
|
2225c1f2d8 | ||
|
|
2d0c0d5845 | ||
|
|
60f1756cbb | ||
|
|
738a1d250a | ||
|
|
c8e65e1e30 | ||
|
|
ecb09ce6f2 | ||
|
|
72a1484a71 | ||
|
|
de31c10c7c | ||
|
|
84483c229c | ||
|
|
b7e35a8fa8 | ||
|
|
8c190a26a5 | ||
|
|
2e5705125b | ||
|
|
daaa92def0 | ||
|
|
86ec97678e | ||
|
|
d74b82dc55 | ||
|
|
821ade2006 | ||
|
|
3ee999dccd | ||
|
|
f91bda51e1 | ||
|
|
47255fc331 | ||
|
|
f7488bed04 | ||
|
|
a94b3a82c4 | ||
|
|
1c8f64f5e6 | ||
|
|
a015e4df3f | ||
|
|
2489a49924 | ||
|
|
d418fbd60d | ||
|
|
cc2e7704e6 | ||
|
|
a980a56dfa | ||
|
|
da588e3bc0 | ||
|
|
8b6f45d9b7 | ||
|
|
9bdfe33baf | ||
|
|
13d338f615 | ||
|
|
36a8641c8d | ||
|
|
7bde6f99fc | ||
|
|
45428ce991 | ||
|
|
8eb5898ef6 | ||
|
|
556e1c972c | ||
|
|
df8f3e7122 | ||
|
|
da1d575806 | ||
|
|
c4d40a1dde | ||
|
|
912de926d0 | ||
|
|
c60fc1e31f | ||
|
|
386e607887 | ||
|
|
94c9b8d057 | ||
|
|
5f81275b10 | ||
|
|
37c484411b | ||
|
|
ad1f890742 | ||
|
|
2924529fa7 | ||
|
|
ebe675cae1 | ||
|
|
a40c666775 | ||
|
|
2ea060d3b3 | ||
|
|
f8a67839dd | ||
|
|
2773b12c9b | ||
|
|
929e12f976 | ||
|
|
8fbc6c4662 | ||
|
|
797378e9c8 | ||
|
|
113464a7d1 | ||
|
|
a13c837202 | ||
|
|
48765f1ae5 | ||
|
|
091ee56368 | ||
|
|
015a971147 | ||
|
|
7575a01a28 | ||
|
|
7aa14cafea | ||
|
|
db10721386 | ||
|
|
6112cf8d60 | ||
|
|
50caeba322 | ||
|
|
b3499984b3 | ||
|
|
a5609a7a82 | ||
|
|
8626a87860 | ||
|
|
fa31cd0e98 | ||
|
|
6b6b7c6289 | ||
|
|
baa3b272ab | ||
|
|
d7c4f244cc | ||
|
|
e21d226564 | ||
|
|
6ff6a7d4a4 | ||
|
|
daf19a561c | ||
|
|
26226a75ff | ||
|
|
4473edf476 | ||
|
|
54cf0a6470 | ||
|
|
0eb8f7e538 | ||
|
|
23b72c65ba | ||
|
|
db7d89600c | ||
|
|
67d51ad1d6 | ||
|
|
56b71cf7fe | ||
|
|
e0ec2a521f | ||
|
|
e8589ac7b5 | ||
|
|
21e425acee | ||
|
|
ee316052ae | ||
|
|
3463936ae0 | ||
|
|
5ff947b279 | ||
|
|
fdf2ea84ec | ||
|
|
ad9b001b6a | ||
|
|
1308571c10 | ||
|
|
b8cb3419c1 | ||
|
|
02533cf947 | ||
|
|
bf8bd04dc7 | ||
|
|
1894376ab6 | ||
|
|
c789e4df44 | ||
|
|
884685de4a | ||
|
|
7fda7be457 | ||
|
|
5daf759033 | ||
|
|
589ab0896a | ||
|
|
7645ab978f | ||
|
|
e6497289da | ||
|
|
95a9f4769d | ||
|
|
7917601f7a | ||
|
|
3400238fc5 | ||
|
|
cbd335c6aa | ||
|
|
9feaadd32a | ||
|
|
2ec008b3b7 | ||
|
|
c9a462a1c6 | ||
|
|
ab44aa7e68 | ||
|
|
9b9d3176ec | ||
|
|
5dda3e2c81 | ||
|
|
4b8dc12c98 | ||
|
|
044e4c4c75 | ||
|
|
2149630865 | ||
|
|
3d435a1d7e | ||
|
|
f2d993a958 | ||
|
|
7bf75b8dc5 | ||
|
|
dfbdce1dc8 | ||
|
|
63f5566e65 | ||
|
|
4b0f43f6c0 | ||
|
|
98e1ef7362 | ||
|
|
4e0ffcb3c8 | ||
|
|
a93a46d6c0 | ||
|
|
e163302522 | ||
|
|
838afc35c3 | ||
|
|
3a62bfab57 | ||
|
|
560b3a246c | ||
|
|
4360916750 | ||
|
|
3f31edc1c0 | ||
|
|
bd874d436b | ||
|
|
fbc47425f4 | ||
|
|
c9df6ff059 | ||
|
|
ef6ff85e96 | ||
|
|
bb93792f57 | ||
|
|
1f7ab4fccb | ||
|
|
2535e82618 | ||
|
|
66d80c8523 | ||
|
|
834a17fe82 | ||
|
|
ea85167e06 | ||
|
|
e007a06dda | ||
|
|
02f9e1e935 | ||
|
|
21b7d431a7 | ||
|
|
307b932f87 | ||
|
|
6983d1cd3c | ||
|
|
a193c9bb3c | ||
|
|
aa67c7ad6d | ||
|
|
70fc686249 | ||
|
|
c87a456a46 | ||
|
|
456bb1e95b | ||
|
|
b0b334103d | ||
|
|
78851e3b57 | ||
|
|
850a883e14 | ||
|
|
6e0ced5ffe | ||
|
|
64cd8febaa | ||
|
|
6fbe1cffaa | ||
|
|
601e781ef9 | ||
|
|
d26ad35573 | ||
|
|
b70c510734 | ||
|
|
29a7158488 | ||
|
|
1227ca020a | ||
|
|
cd7e6ff98d | ||
|
|
510a0f77f6 | ||
|
|
6d1dabb1db | ||
|
|
2e337891da | ||
|
|
d49e18a83e | ||
|
|
c14560ec18 | ||
|
|
e3e31cd9f2 | ||
|
|
adf9627045 | ||
|
|
c7b03c7765 | ||
|
|
b5f83215d5 | ||
|
|
96e3fc5533 | ||
|
|
828e7dda03 | ||
|
|
8ef50c30d5 | ||
|
|
cbe1d5b608 | ||
|
|
7123a9e986 | ||
|
|
af5996b972 | ||
|
|
15e947784b | ||
|
|
1b382c201e | ||
|
|
8deca4fb0c | ||
|
|
96c4372609 | ||
|
|
ca7a109037 | ||
|
|
c54f5b3c5d | ||
|
|
652942ab9f | ||
|
|
2cc19a9c36 | ||
|
|
6ffb3f4bbd | ||
|
|
bab4278318 | ||
|
|
013d18a426 | ||
|
|
e94e27910e | ||
|
|
34cea6e74a | ||
|
|
640e160863 | ||
|
|
3100963250 | ||
|
|
2086358762 | ||
|
|
ae273c589d | ||
|
|
a229015fcd | ||
|
|
b001680674 | ||
|
|
e684133f72 | ||
|
|
2b020eecc7 | ||
|
|
78f4d6faca | ||
|
|
f07b7a049e | ||
|
|
544637779c | ||
|
|
38b6427e4e | ||
|
|
e36822a19c | ||
|
|
e1a114976f | ||
|
|
5ba9ab3457 | ||
|
|
36edf9ed54 | ||
|
|
e788ffa851 | ||
|
|
e0d819b88d | ||
|
|
e3b216ad09 | ||
|
|
55d0fd452d | ||
|
|
089fd02b2e | ||
|
|
8cfd820dcd | ||
|
|
67ed9860fe | ||
|
|
ee924e3a34 | ||
|
|
9e5085ba79 | ||
|
|
dbfdbbff20 | ||
|
|
21dc72bf11 | ||
|
|
c8295c4724 | ||
|
|
44b4dd3d1b | ||
|
|
7e543c6acb | ||
|
|
63514d149f | ||
|
|
d7e559749d | ||
|
|
a2be40fcbc | ||
|
|
771df5c372 | ||
|
|
2d3d6348ad | ||
|
|
a2bf15f0bc | ||
|
|
0aa25df88f | ||
|
|
36afb1c0ee | ||
|
|
c9d61906fb | ||
|
|
d8440a01d3 | ||
|
|
74d92312ef | ||
|
|
0dc9823d2b | ||
|
|
9c69737073 | ||
|
|
66187dcf04 | ||
|
|
79943560bc | ||
|
|
b3321f9c9a | ||
|
|
428c269a49 | ||
|
|
e84964a321 | ||
|
|
0394ea5356 | ||
|
|
852b086920 | ||
|
|
b7fceee2b7 | ||
|
|
ecf6c957c9 | ||
|
|
5e0b0070ff | ||
|
|
9934bc31a3 | ||
|
|
7b4711f5cf | ||
|
|
844066815d | ||
|
|
3a6293e696 | ||
|
|
3210b8601d | ||
|
|
181788802d | ||
|
|
4b627ce776 | ||
|
|
8b799bb5c8 | ||
|
|
5bc8336fce | ||
|
|
4f9f8ddcec | ||
|
|
29f1f63ef8 | ||
|
|
48ecdff5f7 | ||
|
|
411acd2d5a | ||
|
|
e6742fe889 | ||
|
|
b6561719a7 | ||
|
|
2bf3d6f9a6 | ||
|
|
b2700b5975 | ||
|
|
95b28874da | ||
|
|
4934ee837c | ||
|
|
3cbfd5cd10 | ||
|
|
da28ce310b | ||
|
|
ac6d93a3b9 | ||
|
|
104028204d | ||
|
|
d3e61b42dd | ||
|
|
6351cabb62 | ||
|
|
ddef42126b | ||
|
|
9dd39a7f02 | ||
|
|
ca7f7e97e7 | ||
|
|
8a40349b0c | ||
|
|
6ec6fa4973 | ||
|
|
f0644710e6 | ||
|
|
34048726ab | ||
|
|
60ce6c9370 | ||
|
|
554fccc236 | ||
|
|
7611c043c3 | ||
|
|
976d793474 | ||
|
|
f0f997fadd | ||
|
|
0ce3c9892d | ||
|
|
9743565285 | ||
|
|
fcfe9e4790 | ||
|
|
be36432296 | ||
|
|
fb725bff19 | ||
|
|
2384cf9f9f | ||
|
|
1261930fd9 | ||
|
|
120de4e49f | ||
|
|
354a51769b | ||
|
|
a9f937baa3 | ||
|
|
1790d82a6e | ||
|
|
261c20e95a | ||
|
|
ed6556b1f0 | ||
|
|
a86af8c32a | ||
|
|
1670ab45a0 | ||
|
|
7dc4750f3b | ||
|
|
b5f366680d | ||
|
|
fa9e9a0b2b | ||
|
|
2239b82a4b | ||
|
|
3b631678f5 | ||
|
|
2b111a9688 | ||
|
|
0bda1f4f88 | ||
|
|
7d50e0e1c5 | ||
|
|
224a4caab0 | ||
|
|
b4689da404 | ||
|
|
af66657399 | ||
|
|
0f3e2d8275 | ||
|
|
d664b6defc | ||
|
|
adbf74a6e0 | ||
|
|
7eb401efed | ||
|
|
ba97381b99 | ||
|
|
3de92de225 | ||
|
|
01a195c8aa | ||
|
|
12d43ef68a | ||
|
|
0df806a6d1 | ||
|
|
f8c713b260 | ||
|
|
4d0122f97c | ||
|
|
7874950a7a | ||
|
|
577afc8947 | ||
|
|
5a3e69e8ed | ||
|
|
67ee595eb4 | ||
|
|
992f8eaeb8 | ||
|
|
dde5a57136 | ||
|
|
ae49950ae6 | ||
|
|
b56ea3a479 | ||
|
|
03d4ea046d | ||
|
|
248741b2c0 | ||
|
|
ef307664e2 | ||
|
|
05c497a5a0 | ||
|
|
f8239780b2 | ||
|
|
ff12bf8205 | ||
|
|
0c3adf055c | ||
|
|
d9b1f5d45f | ||
|
|
5ab3dded30 | ||
|
|
991d9ead27 | ||
|
|
25c0d036f2 | ||
|
|
c06d8151e6 | ||
|
|
0e9ba25637 | ||
|
|
bd7ca7f3a7 | ||
|
|
26146554a3 | ||
|
|
884746a5a1 | ||
|
|
ab0e68110c | ||
|
|
e166d18903 | ||
|
|
2152ba43a8 | ||
|
|
f42c5d04ee | ||
|
|
ea535fa393 | ||
|
|
e6d118e8cc | ||
|
|
35a921e436 | ||
|
|
25cc3e42f3 | ||
|
|
14344756da | ||
|
|
cb270d3185 | ||
|
|
d5cef39f1b | ||
|
|
b782af427e | ||
|
|
6b503a0733 | ||
|
|
4a3741312e | ||
|
|
aed140a684 | ||
|
|
5b93df9703 | ||
|
|
5ae162400c | ||
|
|
f828b57159 | ||
|
|
d0cfc67f07 | ||
|
|
2f48c3110c | ||
|
|
6cdc35c82f | ||
|
|
9214a22cc9 | ||
|
|
5ba1156245 | ||
|
|
cb91cdff1d | ||
|
|
4df6a4e79d | ||
|
|
5b82a48267 | ||
|
|
8f70c50a48 | ||
|
|
5fe4d81fa4 | ||
|
|
7d3addbf0a | ||
|
|
b7d5873eb7 | ||
|
|
4e40cc19d5 | ||
|
|
1bc9316bc1 | ||
|
|
c995ec1dca | ||
|
|
4d2fbbae04 | ||
|
|
2776928946 | ||
|
|
8cc87c6540 | ||
|
|
3c212022aa | ||
|
|
511c4d09e5 | ||
|
|
d7eba27dc5 | ||
|
|
09370618ca | ||
|
|
2197167088 | ||
|
|
b527635fe7 | ||
|
|
695309bc32 | ||
|
|
97b2f68ec7 | ||
|
|
593044dbf3 | ||
|
|
1fcf44fb8d | ||
|
|
a2a472baf9 | ||
|
|
b5b4a50d94 | ||
|
|
f1b5464052 | ||
|
|
2c0224db22 | ||
|
|
1e78eecb40 | ||
|
|
3626faea60 | ||
|
|
a0177f1174 | ||
|
|
db5fe4a2cd | ||
|
|
5716143168 | ||
|
|
2a59b23149 | ||
|
|
bdbec4ed02 | ||
|
|
25193f1805 | ||
|
|
4840c816a2 | ||
|
|
d0a8e3770b | ||
|
|
1cf3d50864 | ||
|
|
d1b98f7d6d | ||
|
|
4bc87ff812 | ||
|
|
e1df11b360 | ||
|
|
34606a4f04 | ||
|
|
c4c5fc4bf6 | ||
|
|
cd87ce5373 | ||
|
|
90fc16b888 | ||
|
|
c2d0b71d22 | ||
|
|
e54473682c | ||
|
|
1c8d64d98c | ||
|
|
a19437f42f | ||
|
|
855e2f2c77 | ||
|
|
bd3cf88123 | ||
|
|
e4578ad3fc | ||
|
|
39e56ef864 | ||
|
|
51b77da760 | ||
|
|
4b83219a9b | ||
|
|
3ed07dd299 | ||
|
|
bb7daed7f6 | ||
|
|
0c84c47752 | ||
|
|
c18a185474 | ||
|
|
8ff66b04d8 | ||
|
|
94d6556e04 | ||
|
|
6d960265e4 | ||
|
|
cf4ca76e10 | ||
|
|
c7760e9903 | ||
|
|
d51bedceb6 | ||
|
|
125dc021d5 | ||
|
|
5bce481648 | ||
|
|
20153f62cf | ||
|
|
e302dfccf1 | ||
|
|
594b841490 | ||
|
|
40c354f79f | ||
|
|
b77959f300 | ||
|
|
59d6026a2b | ||
|
|
14226d1270 | ||
|
|
955f4da708 | ||
|
|
700b0359ea | ||
|
|
fe95b894d7 | ||
|
|
38a2712a8f | ||
|
|
d1ea091574 | ||
|
|
6bc812fc2f | ||
|
|
61b89fbd72 | ||
|
|
a2c065bdf2 | ||
|
|
88479f674b | ||
|
|
5edbacde74 | ||
|
|
67fc51224b | ||
|
|
101f3294b4 | ||
|
|
6c5622f732 | ||
|
|
f2a6fe1445 | ||
|
|
b0b593443f | ||
|
|
9b05185add | ||
|
|
17316da536 | ||
|
|
f3ca4dd989 | ||
|
|
e2b7bdac8c | ||
|
|
f86f6dc438 | ||
|
|
2bac0ed505 | ||
|
|
ae4078bb7f | ||
|
|
afaffbd9a2 | ||
|
|
b878e59e2e | ||
|
|
4bb3f625dd | ||
|
|
b7978cafa5 | ||
|
|
17f376c76f | ||
|
|
2774fdf158 | ||
|
|
11081efcb0 | ||
|
|
1b412c3027 | ||
|
|
73ec66e627 | ||
|
|
4ae4cd80b1 | ||
|
|
6eb27c66fc | ||
|
|
f96fd17fd3 | ||
|
|
c255a2494d | ||
|
|
86a9846300 | ||
|
|
db877d253c | ||
|
|
0acf1e3b08 | ||
|
|
362ed3a9b6 | ||
|
|
758878a229 | ||
|
|
ffb6dfc333 | ||
|
|
66da74e00a | ||
|
|
d41a0045cb | ||
|
|
b65629ba0e | ||
|
|
9518e6d1a0 | ||
|
|
4f374ee885 | ||
|
|
afa239056e | ||
|
|
886825af11 | ||
|
|
198de925aa | ||
|
|
3f7b71e9a5 | ||
|
|
95baaf8603 | ||
|
|
3673264bab | ||
|
|
64fb5a6b63 | ||
|
|
e9c959ccdb | ||
|
|
4b7487e92e | ||
|
|
52dbcffd8e | ||
|
|
24ae354bc2 | ||
|
|
b30b91fd91 | ||
|
|
efb63afc74 | ||
|
|
16706f7169 | ||
|
|
d7c32676b5 | ||
|
|
c8c45446bc | ||
|
|
f4de2e27d7 | ||
|
|
970fcbd93b | ||
|
|
57d1cd7f1e | ||
|
|
522fc372fa | ||
|
|
7141690fcb | ||
|
|
c7d9177e68 | ||
|
|
00b3ea40d9 | ||
|
|
c9afe939dc | ||
|
|
4171ae6516 | ||
|
|
35a42c49d5 | ||
|
|
e4dbf56b49 | ||
|
|
76eeb10c47 | ||
|
|
9fa73ad54f | ||
|
|
6034a4fd06 | ||
|
|
9d15310b04 | ||
|
|
f04ec3e465 | ||
|
|
0071e7a462 | ||
|
|
d697461cc2 | ||
|
|
517ff00a0f | ||
|
|
d06017c045 | ||
|
|
1b819d96a5 | ||
|
|
ad2bfc31bc | ||
|
|
66b4f12fb3 | ||
|
|
40de2575bb | ||
|
|
be4a95fe91 | ||
|
|
c685b5e679 | ||
|
|
99baeba735 | ||
|
|
bc6b6d39da | ||
|
|
2bb814e170 | ||
|
|
3bf78c78e3 | ||
|
|
e38ecaec4c | ||
|
|
af40c78b56 | ||
|
|
12b206f9fa | ||
|
|
2cc51ba089 | ||
|
|
52f0846d5d | ||
|
|
3fa8848e77 | ||
|
|
41276e3d7e | ||
|
|
4cef93c95e | ||
|
|
cdd999ee03 | ||
|
|
4f253323db | ||
|
|
351f749e20 | ||
|
|
1e83fc4b9a | ||
|
|
c532bd1063 | ||
|
|
e4631a8176 | ||
|
|
ee8dad0c87 | ||
|
|
4163b2f22a | ||
|
|
6aaf3afa38 | ||
|
|
2a7eb44281 | ||
|
|
08bbc93793 | ||
|
|
789478df13 | ||
|
|
cd4f1c9d97 | ||
|
|
1a2e9fb942 | ||
|
|
d0865739de | ||
|
|
0696bbab72 | ||
|
|
4b4c17ac24 | ||
|
|
d768172da1 | ||
|
|
2a4d24309d | ||
|
|
bc01ce4552 | ||
|
|
ef0efe66bd | ||
|
|
7c21f65723 | ||
|
|
cec53e907f | ||
|
|
006ced0430 | ||
|
|
bee6c0ba11 | ||
|
|
3cb880ff3f | ||
|
|
f1d54e4a14 | ||
|
|
f4aaed7f9c | ||
|
|
46ad76c5d2 | ||
|
|
8f731cebc8 | ||
|
|
6dbf9dacd6 | ||
|
|
94ab760c67 | ||
|
|
4ed3880bad | ||
|
|
ff8dcd30a5 | ||
|
|
8ced91d0fa | ||
|
|
f2c6fa2b8e | ||
|
|
9b1bacd167 | ||
|
|
964c97200c | ||
|
|
a3f3384ac9 | ||
|
|
8b546fbf27 | ||
|
|
15da711087 | ||
|
|
bfee7dd449 | ||
|
|
9de2a91e80 | ||
|
|
bf50c801b2 | ||
|
|
c19a4a94f4 | ||
|
|
b6fe94116b | ||
|
|
bcf604c773 | ||
|
|
74984a9114 | ||
|
|
8c1e241286 | ||
|
|
f666d737cb | ||
|
|
a01609f1d1 | ||
|
|
8ca9ccaf00 | ||
|
|
fc5374108c | ||
|
|
15452ded52 | ||
|
|
49c6c4412b | ||
|
|
cfc53f66a8 | ||
|
|
ec1fb7247c | ||
|
|
54b1eef8ae | ||
|
|
f448314309 | ||
|
|
c4e8debb15 | ||
|
|
822839c813 | ||
|
|
27d36a11ca | ||
|
|
92d9ca932d | ||
|
|
69e1f5ff0b | ||
|
|
d265c14841 | ||
|
|
1148245226 | ||
|
|
f53d9f94e6 | ||
|
|
4e3d832834 |
167
.editorconfig
Normal file
167
.editorconfig
Normal file
@@ -0,0 +1,167 @@
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# C# files
|
||||
[*.cs]
|
||||
|
||||
# Indentation and spacing
|
||||
charset = utf-8
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
tab_width = 4
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# New line preferences
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
max_line_length = unset
|
||||
|
||||
# using directive preferences
|
||||
csharp_using_directive_placement = outside_namespace
|
||||
dotnet_diagnostic.IDE0005.severity = error
|
||||
|
||||
# Code-block preferences
|
||||
csharp_style_namespace_declarations = block_scoped
|
||||
csharp_style_prefer_method_group_conversion = true
|
||||
csharp_style_prefer_top_level_statements = false
|
||||
|
||||
# Expression-level preferences
|
||||
csharp_prefer_simple_default_expression = true
|
||||
csharp_style_inlined_variable_declaration = true
|
||||
csharp_style_unused_value_assignment_preference = discard_variable
|
||||
csharp_style_unused_value_expression_statement_preference = discard_variable
|
||||
dotnet_diagnostic.IDE0001.severity = warning
|
||||
dotnet_diagnostic.IDE0002.severity = warning
|
||||
dotnet_diagnostic.IDE0004.severity = warning
|
||||
dotnet_diagnostic.IDE0010.severity = error
|
||||
dotnet_diagnostic.IDE0051.severity = warning
|
||||
dotnet_diagnostic.IDE0052.severity = warning
|
||||
dotnet_diagnostic.IDE0072.severity = warning
|
||||
dotnet_diagnostic.IDE0080.severity = warning
|
||||
dotnet_diagnostic.IDE0100.severity = error
|
||||
dotnet_diagnostic.IDE0110.severity = error
|
||||
dotnet_diagnostic.IDE0120.severity = warning
|
||||
dotnet_diagnostic.IDE0121.severity = warning
|
||||
dotnet_diagnostic.IDE0240.severity = error
|
||||
dotnet_diagnostic.IDE0241.severity = error
|
||||
dotnet_style_coalesce_expression = true
|
||||
dotnet_style_namespace_match_folder = false
|
||||
dotnet_style_null_propagation = true
|
||||
dotnet_style_prefer_auto_properties = true
|
||||
dotnet_style_prefer_collection_expression = when_types_loosely_match
|
||||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
|
||||
dotnet_style_prefer_compound_assignment = true
|
||||
csharp_style_prefer_simple_property_accessors = true
|
||||
dotnet_style_prefer_simplified_interpolation = true
|
||||
dotnet_style_prefer_simplified_boolean_expressions = true
|
||||
csharp_style_prefer_unbound_generic_type_in_nameof = true
|
||||
|
||||
# Field preferences
|
||||
dotnet_diagnostic.IDE0044.severity = warning
|
||||
dotnet_style_readonly_field = true
|
||||
|
||||
# Language keyword vs. framework types preferences
|
||||
dotnet_diagnostic.IDE0049.severity = error
|
||||
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||
dotnet_style_predefined_type_for_member_access = true
|
||||
|
||||
# Modifier preferences
|
||||
csharp_prefer_static_local_function = true
|
||||
csharp_style_prefer_readonly_struct = true
|
||||
dotnet_diagnostic.IDE0036.severity = warning
|
||||
dotnet_diagnostic.IDE0040.severity = error
|
||||
dotnet_diagnostic.IDE0380.severity = error
|
||||
dotnet_style_require_accessibility_modifiers = always
|
||||
|
||||
# New-line preferences
|
||||
dotnet_diagnostic.IDE2000.severity = warning
|
||||
dotnet_diagnostic.IDE2002.severity = warning
|
||||
dotnet_diagnostic.IDE2003.severity = warning
|
||||
dotnet_diagnostic.IDE2004.severity = warning
|
||||
dotnet_diagnostic.IDE2005.severity = warning
|
||||
dotnet_diagnostic.IDE2006.severity = warning
|
||||
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false
|
||||
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false
|
||||
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false
|
||||
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false
|
||||
dotnet_style_allow_multiple_blank_lines_experimental = false
|
||||
dotnet_style_allow_statement_immediately_after_block_experimental = false
|
||||
|
||||
# Null-checking preferences
|
||||
csharp_style_conditional_delegate_call = true
|
||||
|
||||
# Parameter preferences
|
||||
dotnet_code_quality_unused_parameters = all
|
||||
dotnet_diagnostic.IDE0280.severity = error
|
||||
|
||||
# Parentheses preferences
|
||||
dotnet_diagnostic.IDE0047.severity = warning
|
||||
dotnet_diagnostic.IDE0048.severity = warning
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||
|
||||
# Pattern-matching preferences
|
||||
dotnet_diagnostic.IDE0019.severity = warning
|
||||
dotnet_diagnostic.IDE0020.severity = warning
|
||||
dotnet_diagnostic.IDE0038.severity = warning
|
||||
dotnet_diagnostic.IDE0066.severity = none
|
||||
dotnet_diagnostic.IDE0083.severity = warning
|
||||
dotnet_diagnostic.IDE0260.severity = warning
|
||||
csharp_style_pattern_matching_over_as_with_null_check = true
|
||||
csharp_style_pattern_matching_over_is_with_cast_check = true
|
||||
csharp_style_prefer_not_pattern = true
|
||||
csharp_style_prefer_pattern_matching = true
|
||||
|
||||
# this. and Me. preferences
|
||||
dotnet_style_qualification_for_event = false
|
||||
dotnet_style_qualification_for_field = false
|
||||
dotnet_style_qualification_for_method = false
|
||||
dotnet_style_qualification_for_property = false
|
||||
|
||||
# var preferences
|
||||
csharp_style_var_for_built_in_types = false
|
||||
csharp_style_var_when_type_is_apparent = true
|
||||
|
||||
# .NET formatting options
|
||||
dotnet_separate_import_directive_groups = false
|
||||
dotnet_sort_system_directives_first = true
|
||||
|
||||
# C# formatting options
|
||||
csharp_indent_block_contents = true
|
||||
csharp_indent_braces = false
|
||||
csharp_indent_case_contents = true
|
||||
csharp_indent_case_contents_when_block = false
|
||||
csharp_indent_labels = one_less_than_current
|
||||
csharp_indent_switch_labels = true
|
||||
csharp_new_line_before_catch = true
|
||||
csharp_new_line_before_else = true
|
||||
csharp_new_line_before_finally = true
|
||||
csharp_new_line_before_members_in_anonymous_types = true
|
||||
csharp_new_line_before_members_in_object_initializers = true
|
||||
csharp_new_line_before_open_brace = all
|
||||
csharp_new_line_between_query_expression_clauses = true
|
||||
csharp_preserve_single_line_blocks = true
|
||||
csharp_preserve_single_line_statements = true
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_after_comma = true
|
||||
csharp_space_after_dot = false
|
||||
csharp_space_after_keywords_in_control_flow_statements = true
|
||||
csharp_space_after_semicolon_in_for_statement = true
|
||||
csharp_space_around_binary_operators = before_and_after
|
||||
csharp_space_around_declaration_statements = false
|
||||
csharp_space_before_colon_in_inheritance_clause = true
|
||||
csharp_space_before_comma = false
|
||||
csharp_space_before_dot = false
|
||||
csharp_space_before_open_square_brackets = false
|
||||
csharp_space_before_semicolon_in_for_statement = false
|
||||
csharp_space_between_empty_square_brackets = false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||
csharp_space_between_parentheses = false
|
||||
csharp_space_between_square_brackets = false
|
||||
48
.github/workflows/build_and_test.yml
vendored
Normal file
48
.github/workflows/build_and_test.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: Build and Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v5
|
||||
with:
|
||||
dotnet-version: |
|
||||
8.0.x
|
||||
9.0.x
|
||||
10.0.x
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test
|
||||
|
||||
- name: Run publish script
|
||||
run: ./publish-nix.sh -d
|
||||
|
||||
- name: Update rolling tag
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git tag -f rolling
|
||||
git push origin :refs/tags/rolling || true
|
||||
git push origin rolling --force
|
||||
|
||||
- name: Upload to rolling
|
||||
uses: ncipollo/release-action@v1.20.0
|
||||
with:
|
||||
allowUpdates: True
|
||||
artifacts: "*.nupkg,*.snupkg,*.zip"
|
||||
body: "Last built commit: ${{ github.sha }}"
|
||||
name: "Rolling Release"
|
||||
prerelease: True
|
||||
replacesArtifacts: True
|
||||
tag: "rolling"
|
||||
updateOnlyUnreleased: True
|
||||
43
.github/workflows/build_nupkg.yml
vendored
43
.github/workflows/build_nupkg.yml
vendored
@@ -1,43 +0,0 @@
|
||||
name: Nuget Pack
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Restore dependencies
|
||||
run: dotnet restore
|
||||
|
||||
- name: Pack
|
||||
run: dotnet pack
|
||||
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'Nuget Package'
|
||||
path: 'bin/Release/*.nupkg'
|
||||
|
||||
- name: Upload to rolling
|
||||
uses: ncipollo/release-action@v1.14.0
|
||||
with:
|
||||
allowUpdates: True
|
||||
artifacts: 'bin/Release/*.nupkg'
|
||||
body: 'Last built commit: ${{ github.sha }}'
|
||||
name: 'Rolling Release'
|
||||
prerelease: True
|
||||
replacesArtifacts: True
|
||||
tag: "rolling"
|
||||
updateOnlyUnreleased: True
|
||||
30
.github/workflows/check_pr.yml
vendored
30
.github/workflows/check_pr.yml
vendored
@@ -3,15 +3,21 @@ name: Build PR
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v4
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Build
|
||||
run: dotnet build
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v5
|
||||
with:
|
||||
dotnet-version: |
|
||||
8.0.x
|
||||
9.0.x
|
||||
10.0.x
|
||||
|
||||
- name: Build
|
||||
run: dotnet build
|
||||
|
||||
- name: Run tests
|
||||
run: dotnet test
|
||||
|
||||
328
.gitignore
vendored
328
.gitignore
vendored
@@ -1,15 +1,7 @@
|
||||
*.swp
|
||||
*.*~
|
||||
project.lock.json
|
||||
.DS_Store
|
||||
*.pyc
|
||||
nupkg/
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode
|
||||
|
||||
# Rider
|
||||
.idea
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
@@ -17,6 +9,9 @@ nupkg/
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
@@ -24,15 +19,312 @@ nupkg/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
build/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
msbuild.log
|
||||
msbuild.err
|
||||
msbuild.wrn
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
**/Properties/launchSettings.json
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush
|
||||
.cr/
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
42
.vscode/launch.json
vendored
Normal file
42
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": ".NET Core Launch (ExtractionTool)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/ExtractionTool/bin/Debug/net10.0/ExtractionTool.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false,
|
||||
"justMyCode": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Launch (InfoPrint)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/InfoPrint/bin/Debug/net10.0/InfoPrint.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false,
|
||||
"justMyCode": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach",
|
||||
"processId": "${command:pickProcess}"
|
||||
}
|
||||
]
|
||||
}
|
||||
24
.vscode/tasks.json
vendored
Normal file
24
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "shell",
|
||||
"args": [
|
||||
"build",
|
||||
// Ask dotnet build to generate full paths for file names.
|
||||
"/property:GenerateFullPaths=true",
|
||||
// Do not generate summary otherwise it leads to duplicate errors in Problems panel
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"group": "build",
|
||||
"presentation": {
|
||||
"reveal": "silent"
|
||||
},
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// Separated value serializer/deserializer for AttractMode romlists
|
||||
/// </summary>
|
||||
public static class AttractMode
|
||||
{
|
||||
public const string HeaderWithoutRomname = "#Name;Title;Emulator;CloneOf;Year;Manufacturer;Category;Players;Rotation;Control;Status;DisplayCount;DisplayType;AltRomname;AltTitle;Extra;Buttons";
|
||||
public const int HeaderWithoutRomnameCount = 17;
|
||||
|
||||
public const string HeaderWithRomname = "#Romname;Title;Emulator;Cloneof;Year;Manufacturer;Category;Players;Rotation;Control;Status;DisplayCount;DisplayType;AltRomname;AltTitle;Extra;Buttons;Favourite;Tags;PlayedCount;PlayedTime;FileIsAvailable";
|
||||
public const int HeaderWithRomnameCount = 22;
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.AACS;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class AACS : IByteSerializer<MediaKeyBlock>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MediaKeyBlock? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.AACS().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.BDPlus;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class BDPlus : IByteSerializer<SVM>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public SVM? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.BDPlus().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.BFPK;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class BFPK : IByteSerializer<Archive>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Archive? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.BFPK().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class BSP : IByteSerializer<Models.BSP.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.BSP.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.BSP().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.CFB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class CFB : IByteSerializer<Binary>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Binary? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.CFB().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class CIA : IByteSerializer<Models.N3DS.CIA>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.N3DS.CIA? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.CIA().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class GCF : IByteSerializer<Models.GCF.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.GCF.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.GCF().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class IRD : IByteSerializer<Models.IRD.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.IRD.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.IRD().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.InstallShieldCabinet;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
// TODO: Add multi-cabinet reading
|
||||
public partial class InstallShieldCabinet : IByteSerializer<Cabinet>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Cabinet? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.InstallShieldCabinet().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.LinearExecutable;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class LinearExecutable : IByteSerializer<Executable>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Executable? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.LinearExecutable().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.MSDOS;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class MSDOS : IByteSerializer<Executable>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Executable? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.MSDOS().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.MicrosoftCabinet;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
// TODO: Add multi-cabinet reading
|
||||
public partial class MicrosoftCabinet : IByteSerializer<Cabinet>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Cabinet? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.MicrosoftCabinet().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.MoPaQ;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class MoPaQ : IByteSerializer<Archive>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Archive? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.MoPaQ().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.N3DS;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class N3DS : IByteSerializer<Cart>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Cart? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.N3DS().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class NCF : IByteSerializer<Models.NCF.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.NCF.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.NCF().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.NewExecutable;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class NewExecutable : IByteSerializer<Executable>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Executable? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.NewExecutable().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.Nitro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class Nitro : IByteSerializer<Cart>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Cart? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.Nitro().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class PAK : IByteSerializer<Models.PAK.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.PAK.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.PAK().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.PFF;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class PFF : IByteSerializer<Archive>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Archive? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.PFF().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.PlayJ;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class PlayJAudio : IByteSerializer<AudioFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public AudioFile? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.PlayJAudio().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.PlayJ;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class PlayJPlaylist : IByteSerializer<Playlist>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Playlist? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.PlayJPlaylist().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.PortableExecutable;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class PortableExecutable : IByteSerializer<Executable>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Executable? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.PortableExecutable().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.Quantum;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class Quantum : IByteSerializer<Archive>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Archive? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.Quantum().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class SGA : IByteSerializer<Models.SGA.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.SGA.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.SGA().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class VBSP : IByteSerializer<Models.VBSP.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.VBSP.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.VBSP().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class VPK : IByteSerializer<Models.VPK.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.VPK.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.VPK().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class WAD : IByteSerializer<Models.WAD.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.WAD.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.WAD().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Bytes
|
||||
{
|
||||
public partial class XZP : IByteSerializer<Models.XZP.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.XZP.File? Deserialize(byte[]? data, int offset)
|
||||
{
|
||||
// If the data is invalid
|
||||
if (data == null)
|
||||
return null;
|
||||
|
||||
// If the offset is out of bounds
|
||||
if (offset < 0 || offset >= data.Length)
|
||||
return null;
|
||||
|
||||
// Create a memory stream and parse that
|
||||
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
|
||||
return new Streams.XZP().Deserialize(dataStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.ArchiveDotOrg;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class ArchiveDotOrg : IModelSerializer<Models.ArchiveDotOrg.Files, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.ArchiveDotOrg.Files? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var files = new Models.ArchiveDotOrg.Files();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
files.File = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to an array of <cref="Models.ArchiveDotOrg.File"/>
|
||||
/// </summary>
|
||||
private static Models.ArchiveDotOrg.File[] ConvertFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.ArchiveDotOrg.File"/>
|
||||
/// </summary>
|
||||
private static Models.ArchiveDotOrg.File ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var file = new Models.ArchiveDotOrg.File
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Source = item.ReadString(Models.Metadata.Rom.SourceKey),
|
||||
BitTorrentMagnetHash = item.ReadString(Models.Metadata.Rom.BitTorrentMagnetHashKey),
|
||||
LastModifiedTime = item.ReadString(Models.Metadata.Rom.LastModifiedTimeKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
CRC32 = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
FileCount = item.ReadString(Models.Metadata.Rom.FileCountKey),
|
||||
Format = item.ReadString(Models.Metadata.Rom.FormatKey),
|
||||
Original = item.ReadString(Models.Metadata.Rom.OriginalKey),
|
||||
Summation = item.ReadString(Models.Metadata.Rom.SummationKey),
|
||||
MatrixNumber = item.ReadString(Models.Metadata.Rom.MatrixNumberKey),
|
||||
CollectionCatalogNumber = item.ReadString(Models.Metadata.Rom.CollectionCatalogNumberKey),
|
||||
Comment = item.ReadString(Models.Metadata.Rom.CommentKey),
|
||||
|
||||
ASRDetectedLang = item.ReadString(Models.Metadata.Rom.ASRDetectedLangKey),
|
||||
ASRDetectedLangConf = item.ReadString(Models.Metadata.Rom.ASRDetectedLangConfKey),
|
||||
ASRTranscribedLang = item.ReadString(Models.Metadata.Rom.ASRTranscribedLangKey),
|
||||
WhisperASRModuleVersion = item.ReadString(Models.Metadata.Rom.WhisperASRModuleVersionKey),
|
||||
WhisperModelHash = item.ReadString(Models.Metadata.Rom.WhisperModelHashKey),
|
||||
WhisperModelName = item.ReadString(Models.Metadata.Rom.WhisperModelNameKey),
|
||||
WhisperVersion = item.ReadString(Models.Metadata.Rom.WhisperVersionKey),
|
||||
|
||||
ClothCoverDetectionModuleVersion = item.ReadString(Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey),
|
||||
hOCRCharToWordhOCRVersion = item.ReadString(Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey),
|
||||
hOCRCharToWordModuleVersion = item.ReadString(Models.Metadata.Rom.hOCRCharToWordModuleVersionKey),
|
||||
hOCRFtsTexthOCRVersion = item.ReadString(Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey),
|
||||
hOCRFtsTextModuleVersion = item.ReadString(Models.Metadata.Rom.hOCRFtsTextModuleVersionKey),
|
||||
hOCRPageIndexhOCRVersion = item.ReadString(Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey),
|
||||
hOCRPageIndexModuleVersion = item.ReadString(Models.Metadata.Rom.hOCRPageIndexModuleVersionKey),
|
||||
TesseractOCR = item.ReadString(Models.Metadata.Rom.TesseractOCRKey),
|
||||
TesseractOCRConverted = item.ReadString(Models.Metadata.Rom.TesseractOCRConvertedKey),
|
||||
TesseractOCRDetectedLang = item.ReadString(Models.Metadata.Rom.TesseractOCRDetectedLangKey),
|
||||
TesseractOCRDetectedLangConf = item.ReadString(Models.Metadata.Rom.TesseractOCRDetectedLangConfKey),
|
||||
TesseractOCRDetectedScript = item.ReadString(Models.Metadata.Rom.TesseractOCRDetectedScriptKey),
|
||||
TesseractOCRDetectedScriptConf = item.ReadString(Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey),
|
||||
TesseractOCRModuleVersion = item.ReadString(Models.Metadata.Rom.TesseractOCRModuleVersionKey),
|
||||
TesseractOCRParameters = item.ReadString(Models.Metadata.Rom.TesseractOCRParametersKey),
|
||||
PDFModuleVersion = item.ReadString(Models.Metadata.Rom.PDFModuleVersionKey),
|
||||
WordConfidenceInterval0To10 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval0To10Key),
|
||||
WordConfidenceInterval11To20 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval11To20Key),
|
||||
WordConfidenceInterval21To30 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval21To30Key),
|
||||
WordConfidenceInterval31To40 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval31To40Key),
|
||||
WordConfidenceInterval41To50 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval41To50Key),
|
||||
WordConfidenceInterval51To60 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval51To60Key),
|
||||
WordConfidenceInterval61To70 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval61To70Key),
|
||||
WordConfidenceInterval71To80 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval71To80Key),
|
||||
WordConfidenceInterval81To90 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval81To90Key),
|
||||
WordConfidenceInterval91To100 = item.ReadString(Models.Metadata.Rom.WordConfidenceInterval91To100Key),
|
||||
|
||||
Album = item.ReadString(Models.Metadata.Rom.AlbumKey),
|
||||
Artist = item.ReadString(Models.Metadata.Rom.ArtistKey),
|
||||
Bitrate = item.ReadString(Models.Metadata.Rom.BitrateKey),
|
||||
Creator = item.ReadString(Models.Metadata.Rom.CreatorKey),
|
||||
Height = item.ReadString(Models.Metadata.Rom.HeightKey),
|
||||
Length = item.ReadString(Models.Metadata.Rom.LengthKey),
|
||||
PreviewImage = item.ReadString(Models.Metadata.Rom.PreviewImageKey),
|
||||
Rotation = item.ReadString(Models.Metadata.Rom.RotationKey),
|
||||
Title = item.ReadString(Models.Metadata.Rom.TitleKey),
|
||||
Track = item.ReadString(Models.Metadata.Rom.TrackKey),
|
||||
Width = item.ReadString(Models.Metadata.Rom.WidthKey),
|
||||
};
|
||||
return file;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class ArchiveDotOrg : IModelSerializer<Models.ArchiveDotOrg.Files, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Models.ArchiveDotOrg.Files? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.File != null && item.File.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.File
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ArchiveDotOrg.Files"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.ArchiveDotOrg.Files item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = "archive.org",
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ArchiveDotOrg.File"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Models.ArchiveDotOrg.File? item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine();
|
||||
|
||||
var rom = ConvertToInternalModel(item);
|
||||
if (rom != null)
|
||||
machine[Models.Metadata.Machine.RomKey] = new Models.Metadata.Rom[] { rom };
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ArchiveDotOrg.File"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom? ConvertToInternalModel(Models.ArchiveDotOrg.File? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SourceKey] = item.Source,
|
||||
[Models.Metadata.Rom.BitTorrentMagnetHashKey] = item.BitTorrentMagnetHash,
|
||||
[Models.Metadata.Rom.LastModifiedTimeKey] = item.LastModifiedTime,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC32,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.FileCountKey] = item.FileCount,
|
||||
[Models.Metadata.Rom.FormatKey] = item.Format,
|
||||
[Models.Metadata.Rom.OriginalKey] = item.Original,
|
||||
[Models.Metadata.Rom.SummationKey] = item.Summation,
|
||||
[Models.Metadata.Rom.MatrixNumberKey] = item.MatrixNumber,
|
||||
[Models.Metadata.Rom.CollectionCatalogNumberKey] = item.CollectionCatalogNumber,
|
||||
[Models.Metadata.Rom.PublisherKey] = item.Publisher,
|
||||
[Models.Metadata.Rom.CommentKey] = item.Comment,
|
||||
|
||||
[Models.Metadata.Rom.ASRDetectedLangKey] = item.ASRDetectedLang,
|
||||
[Models.Metadata.Rom.ASRDetectedLangConfKey] = item.ASRDetectedLangConf,
|
||||
[Models.Metadata.Rom.ASRTranscribedLangKey] = item.ASRTranscribedLang,
|
||||
[Models.Metadata.Rom.WhisperASRModuleVersionKey] = item.WhisperASRModuleVersion,
|
||||
[Models.Metadata.Rom.WhisperModelHashKey] = item.WhisperModelHash,
|
||||
[Models.Metadata.Rom.WhisperModelNameKey] = item.WhisperModelName,
|
||||
[Models.Metadata.Rom.WhisperVersionKey] = item.WhisperVersion,
|
||||
|
||||
[Models.Metadata.Rom.ClothCoverDetectionModuleVersionKey] = item.ClothCoverDetectionModuleVersion,
|
||||
[Models.Metadata.Rom.hOCRCharToWordhOCRVersionKey] = item.hOCRCharToWordhOCRVersion,
|
||||
[Models.Metadata.Rom.hOCRCharToWordModuleVersionKey] = item.hOCRCharToWordModuleVersion,
|
||||
[Models.Metadata.Rom.hOCRFtsTexthOCRVersionKey] = item.hOCRFtsTexthOCRVersion,
|
||||
[Models.Metadata.Rom.hOCRFtsTextModuleVersionKey] = item.hOCRFtsTextModuleVersion,
|
||||
[Models.Metadata.Rom.hOCRPageIndexhOCRVersionKey] = item.hOCRPageIndexhOCRVersion,
|
||||
[Models.Metadata.Rom.hOCRPageIndexModuleVersionKey] = item.hOCRPageIndexModuleVersion,
|
||||
[Models.Metadata.Rom.TesseractOCRKey] = item.TesseractOCR,
|
||||
[Models.Metadata.Rom.TesseractOCRConvertedKey] = item.TesseractOCRConverted,
|
||||
[Models.Metadata.Rom.TesseractOCRDetectedLangKey] = item.TesseractOCRDetectedLang,
|
||||
[Models.Metadata.Rom.TesseractOCRDetectedLangConfKey] = item.TesseractOCRDetectedLangConf,
|
||||
[Models.Metadata.Rom.TesseractOCRDetectedScriptKey] = item.TesseractOCRDetectedScript,
|
||||
[Models.Metadata.Rom.TesseractOCRDetectedScriptConfKey] = item.TesseractOCRDetectedScriptConf,
|
||||
[Models.Metadata.Rom.TesseractOCRModuleVersionKey] = item.TesseractOCRModuleVersion,
|
||||
[Models.Metadata.Rom.TesseractOCRParametersKey] = item.TesseractOCRParameters,
|
||||
[Models.Metadata.Rom.PDFModuleVersionKey] = item.PDFModuleVersion,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval0To10Key] = item.WordConfidenceInterval0To10,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval11To20Key] = item.WordConfidenceInterval11To20,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval21To30Key] = item.WordConfidenceInterval21To30,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval31To40Key] = item.WordConfidenceInterval31To40,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval41To50Key] = item.WordConfidenceInterval41To50,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval51To60Key] = item.WordConfidenceInterval51To60,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval61To70Key] = item.WordConfidenceInterval61To70,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval71To80Key] = item.WordConfidenceInterval71To80,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval81To90Key] = item.WordConfidenceInterval81To90,
|
||||
[Models.Metadata.Rom.WordConfidenceInterval91To100Key] = item.WordConfidenceInterval91To100,
|
||||
|
||||
[Models.Metadata.Rom.AlbumKey] = item.Album,
|
||||
[Models.Metadata.Rom.ArtistKey] = item.Artist,
|
||||
[Models.Metadata.Rom.BitrateKey] = item.Bitrate,
|
||||
[Models.Metadata.Rom.CreatorKey] = item.Creator,
|
||||
[Models.Metadata.Rom.HeightKey] = item.Height,
|
||||
[Models.Metadata.Rom.LengthKey] = item.Length,
|
||||
[Models.Metadata.Rom.PreviewImageKey] = item.PreviewImage,
|
||||
[Models.Metadata.Rom.RotationKey] = item.Rotation,
|
||||
[Models.Metadata.Rom.TitleKey] = item.Title,
|
||||
[Models.Metadata.Rom.TrackKey] = item.Track,
|
||||
[Models.Metadata.Rom.WidthKey] = item.Width,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class AttractMode : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.AttractMode.MetadataFile"/>
|
||||
/// </summary>
|
||||
private static MetadataFile ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var metadataFile = new MetadataFile
|
||||
{
|
||||
Header = item.ReadStringArray(Models.Metadata.Header.HeaderKey),
|
||||
};
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to an array of <cref="Models.AttractMode.Row"/>
|
||||
/// </summary>
|
||||
private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null || !roms.Any())
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.AttractMode.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Rom item, Models.Metadata.Machine parent)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
Name = parent.ReadString(Models.Metadata.Machine.NameKey),
|
||||
Title = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Emulator = parent.ReadString(Models.Metadata.Machine.EmulatorKey),
|
||||
CloneOf = parent.ReadString(Models.Metadata.Machine.CloneOfKey),
|
||||
Year = parent.ReadString(Models.Metadata.Machine.YearKey),
|
||||
Manufacturer = parent.ReadString(Models.Metadata.Machine.ManufacturerKey),
|
||||
Category = parent.ReadString(Models.Metadata.Machine.CategoryKey),
|
||||
Players = parent.ReadString(Models.Metadata.Machine.PlayersKey),
|
||||
Rotation = parent.ReadString(Models.Metadata.Machine.RotationKey),
|
||||
Control = parent.ReadString(Models.Metadata.Machine.ControlKey),
|
||||
Status = parent.ReadString(Models.Metadata.Machine.StatusKey),
|
||||
DisplayCount = parent.ReadString(Models.Metadata.Machine.DisplayCountKey),
|
||||
DisplayType = parent.ReadString(Models.Metadata.Machine.DisplayTypeKey),
|
||||
AltRomname = item.ReadString(Models.Metadata.Rom.AltRomnameKey),
|
||||
AltTitle = item.ReadString(Models.Metadata.Rom.AltTitleKey),
|
||||
Extra = parent.ReadString(Models.Metadata.Machine.ExtraKey),
|
||||
Buttons = parent.ReadString(Models.Metadata.Machine.ButtonsKey),
|
||||
Favorite = parent.ReadString(Models.Metadata.Machine.FavoriteKey),
|
||||
Tags = parent.ReadString(Models.Metadata.Machine.TagsKey),
|
||||
PlayedCount = parent.ReadString(Models.Metadata.Machine.PlayedCountKey),
|
||||
PlayedTime = parent.ReadString(Models.Metadata.Machine.PlayedTimeKey),
|
||||
FileIsAvailable = item.ReadString(Models.Metadata.Rom.FileIsAvailableKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class AttractMode : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.AttractMode.MetadataFile"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(MetadataFile item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.HeaderKey] = item.Header,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.AttractMode.Row"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine? ConvertMachineToInternalModel(Row? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
[Models.Metadata.Machine.EmulatorKey] = item.Emulator,
|
||||
[Models.Metadata.Machine.CloneOfKey] = item.CloneOf,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.ManufacturerKey] = item.Manufacturer,
|
||||
[Models.Metadata.Machine.CategoryKey] = item.Category,
|
||||
[Models.Metadata.Machine.PlayersKey] = item.Players,
|
||||
[Models.Metadata.Machine.RotationKey] = item.Rotation,
|
||||
[Models.Metadata.Machine.ControlKey] = item.Control,
|
||||
[Models.Metadata.Machine.StatusKey] = item.Status,
|
||||
[Models.Metadata.Machine.DisplayCountKey] = item.DisplayCount,
|
||||
[Models.Metadata.Machine.DisplayTypeKey] = item.DisplayType,
|
||||
[Models.Metadata.Machine.ExtraKey] = item.Extra,
|
||||
[Models.Metadata.Machine.ButtonsKey] = item.Buttons,
|
||||
[Models.Metadata.Machine.FavoriteKey] = item.Favorite,
|
||||
[Models.Metadata.Machine.TagsKey] = item.Tags,
|
||||
[Models.Metadata.Machine.PlayedCountKey] = item.PlayedCount,
|
||||
[Models.Metadata.Machine.PlayedTimeKey] = item.PlayedTime,
|
||||
[Models.Metadata.Machine.PlayedTimeKey] = item.PlayedTime,
|
||||
[Models.Metadata.Machine.RomKey] = ConvertToInternalModel(item),
|
||||
};
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.AttractMode.Row"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Row item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Title,
|
||||
[Models.Metadata.Rom.AltRomnameKey] = item.AltRomname,
|
||||
[Models.Metadata.Rom.AltTitleKey] = item.AltTitle,
|
||||
[Models.Metadata.Rom.FileIsAvailableKey] = item.FileIsAvailable,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,394 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class ClrMamePro : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj) => Deserialize(obj, false);
|
||||
|
||||
/// <inheritdoc cref="Deserialize(Models.Metadata.MetadataFile)"/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj, bool game)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
if (header != null)
|
||||
metadataFile.ClrMamePro = ConvertHeaderFromInternalModel(header);
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, game))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.ClrMamePro.ClrMamePro"/>
|
||||
/// </summary>
|
||||
private static Models.ClrMamePro.ClrMamePro ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var clrMamePro = new Models.ClrMamePro.ClrMamePro
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
RootDir = item.ReadString(Models.Metadata.Header.RootDirKey),
|
||||
Category = item.ReadString(Models.Metadata.Header.CategoryKey),
|
||||
Version = item.ReadString(Models.Metadata.Header.VersionKey),
|
||||
Date = item.ReadString(Models.Metadata.Header.DateKey),
|
||||
Author = item.ReadString(Models.Metadata.Header.AuthorKey),
|
||||
Homepage = item.ReadString(Models.Metadata.Header.HomepageKey),
|
||||
Url = item.ReadString(Models.Metadata.Header.UrlKey),
|
||||
Comment = item.ReadString(Models.Metadata.Header.CommentKey),
|
||||
Header = item.ReadString(Models.Metadata.Header.HeaderKey),
|
||||
Type = item.ReadString(Models.Metadata.Header.TypeKey),
|
||||
ForceMerging = item.ReadString(Models.Metadata.Header.ForceMergingKey),
|
||||
ForceZipping = item.ReadString(Models.Metadata.Header.ForceZippingKey),
|
||||
ForcePacking = item.ReadString(Models.Metadata.Header.ForcePackingKey),
|
||||
};
|
||||
return clrMamePro;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Archive"/> to <cref="Models.ClrMamePro.Machine"/>
|
||||
/// </summary>
|
||||
private static GameBase ConvertMachineFromInternalModel(Models.Metadata.Machine item, bool game = false)
|
||||
{
|
||||
GameBase gameBase = game ? new Models.ClrMamePro.Game() : new Models.ClrMamePro.Machine();
|
||||
|
||||
gameBase.Name = item.ReadString(Models.Metadata.Machine.NameKey);
|
||||
gameBase.Description = item.ReadString(Models.Metadata.Machine.DescriptionKey);
|
||||
gameBase.Year = item.ReadString(Models.Metadata.Machine.YearKey);
|
||||
gameBase.Manufacturer = item.ReadString(Models.Metadata.Machine.ManufacturerKey);
|
||||
gameBase.Category = item.ReadString(Models.Metadata.Machine.CategoryKey);
|
||||
gameBase.CloneOf = item.ReadString(Models.Metadata.Machine.CloneOfKey);
|
||||
gameBase.RomOf = item.ReadString(Models.Metadata.Machine.RomOfKey);
|
||||
gameBase.SampleOf = item.ReadString(Models.Metadata.Machine.SampleOfKey);
|
||||
|
||||
var releases = item.Read<Models.Metadata.Release[]>(Models.Metadata.Machine.ReleaseKey);
|
||||
if (releases != null && releases.Any())
|
||||
{
|
||||
gameBase.Release = releases
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
gameBase.BiosSet = biosSets
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
gameBase.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
gameBase.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var medias = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (medias != null && medias.Any())
|
||||
{
|
||||
gameBase.Media = medias
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
gameBase.Sample = samples
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var archives = item.Read<Models.Metadata.Archive[]>(Models.Metadata.Machine.ArchiveKey);
|
||||
if (archives != null && archives.Any())
|
||||
{
|
||||
gameBase.Archive = archives
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var chips = item.Read<Models.Metadata.Chip[]>(Models.Metadata.Machine.ChipKey);
|
||||
if (chips != null && chips.Any())
|
||||
{
|
||||
gameBase.Chip = chips
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var videos = item.Read<Models.Metadata.Video[]>(Models.Metadata.Machine.VideoKey);
|
||||
if (videos != null && videos.Any())
|
||||
{
|
||||
gameBase.Video = videos
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var sound = item.Read<Models.Metadata.Sound>(Models.Metadata.Machine.SoundKey);
|
||||
if (sound != null)
|
||||
gameBase.Sound = ConvertFromInternalModel(sound);
|
||||
|
||||
var input = item.Read<Models.Metadata.Input>(Models.Metadata.Machine.InputKey);
|
||||
if (input != null)
|
||||
gameBase.Input = ConvertFromInternalModel(input);
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Machine.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
gameBase.DipSwitch = dipSwitches
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
gameBase.Driver = ConvertFromInternalModel(driver);
|
||||
|
||||
return gameBase;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Archive"/> to <cref="Models.ClrMamePro.Archive"/>
|
||||
/// </summary>
|
||||
private static Archive ConvertFromInternalModel(Models.Metadata.Archive item)
|
||||
{
|
||||
var archive = new Archive
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Archive.NameKey),
|
||||
};
|
||||
return archive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.BiosSet"/> to <cref="Models.ClrMamePro.BiosSet"/>
|
||||
/// </summary>
|
||||
private static BiosSet ConvertFromInternalModel(Models.Metadata.BiosSet item)
|
||||
{
|
||||
var biosset = new BiosSet
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.BiosSet.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.BiosSet.DescriptionKey),
|
||||
Default = item.ReadString(Models.Metadata.BiosSet.DefaultKey),
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Chip"/> to <cref="Models.ClrMamePro.Chip"/>
|
||||
/// </summary>
|
||||
private static Chip ConvertFromInternalModel(Models.Metadata.Chip item)
|
||||
{
|
||||
var chip = new Chip
|
||||
{
|
||||
Type = item.ReadString(Models.Metadata.Chip.ChipTypeKey),
|
||||
Name = item.ReadString(Models.Metadata.Chip.NameKey),
|
||||
Flags = item.ReadString(Models.Metadata.Chip.FlagsKey),
|
||||
Clock = item.ReadString(Models.Metadata.Chip.ClockKey),
|
||||
};
|
||||
return chip;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipSwitch"/> to <cref="Models.ClrMamePro.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static DipSwitch ConvertFromInternalModel(Models.Metadata.DipSwitch item)
|
||||
{
|
||||
var dipswitch = new DipSwitch
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipSwitch.NameKey),
|
||||
Entry = item[Models.Metadata.DipSwitch.EntryKey] as string[],
|
||||
Default = item.ReadString(Models.Metadata.DipSwitch.DefaultKey),
|
||||
};
|
||||
return dipswitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.ClrMamePro.Disk"/>
|
||||
/// </summary>
|
||||
private static Disk ConvertFromInternalModel(Models.Metadata.Disk item)
|
||||
{
|
||||
var disk = new Disk
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
Merge = item.ReadString(Models.Metadata.Disk.MergeKey),
|
||||
Status = item.ReadString(Models.Metadata.Disk.StatusKey),
|
||||
Flags = item.ReadString(Models.Metadata.Disk.FlagsKey),
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Driver"/> to <cref="Models.ClrMamePro.Driver"/>
|
||||
/// </summary>
|
||||
private static Driver ConvertFromInternalModel(Models.Metadata.Driver item)
|
||||
{
|
||||
var driver = new Driver
|
||||
{
|
||||
Status = item.ReadString(Models.Metadata.Driver.StatusKey),
|
||||
Color = item.ReadString(Models.Metadata.Driver.ColorKey),
|
||||
Sound = item.ReadString(Models.Metadata.Driver.SoundKey),
|
||||
PaletteSize = item.ReadString(Models.Metadata.Driver.PaletteSizeKey),
|
||||
Blit = item.ReadString(Models.Metadata.Driver.BlitKey),
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Input"/> to <cref="Models.ClrMamePro.Input"/>
|
||||
/// </summary>
|
||||
private static Input ConvertFromInternalModel(Models.Metadata.Input item)
|
||||
{
|
||||
var input = new Input
|
||||
{
|
||||
Players = item.ReadString(Models.Metadata.Input.PlayersKey),
|
||||
Control = item.ReadString(Models.Metadata.Input.ControlKey),
|
||||
Buttons = item.ReadString(Models.Metadata.Input.ButtonsKey),
|
||||
Coins = item.ReadString(Models.Metadata.Input.CoinsKey),
|
||||
Tilt = item.ReadString(Models.Metadata.Input.TiltKey),
|
||||
Service = item.ReadString(Models.Metadata.Input.ServiceKey),
|
||||
};
|
||||
return input;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Media"/> to <cref="Models.ClrMamePro.Media"/>
|
||||
/// </summary>
|
||||
private static Media ConvertFromInternalModel(Models.Metadata.Media item)
|
||||
{
|
||||
var media = new Media
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Media.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Media.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Media.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Media.SHA256Key),
|
||||
SpamSum = item.ReadString(Models.Metadata.Media.SpamSumKey),
|
||||
};
|
||||
return media;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Release"/> to <cref="Models.ClrMamePro.Release"/>
|
||||
/// </summary>
|
||||
private static Release ConvertFromInternalModel(Models.Metadata.Release item)
|
||||
{
|
||||
var release = new Release
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Release.NameKey),
|
||||
Region = item.ReadString(Models.Metadata.Release.RegionKey),
|
||||
Language = item.ReadString(Models.Metadata.Release.LanguageKey),
|
||||
Date = item.ReadString(Models.Metadata.Release.DateKey),
|
||||
Default = item.ReadString(Models.Metadata.Release.DefaultKey),
|
||||
};
|
||||
return release;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.ClrMamePro.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var rom = new Rom
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Rom.SHA256Key),
|
||||
SHA384 = item.ReadString(Models.Metadata.Rom.SHA384Key),
|
||||
SHA512 = item.ReadString(Models.Metadata.Rom.SHA512Key),
|
||||
SpamSum = item.ReadString(Models.Metadata.Rom.SpamSumKey),
|
||||
xxHash364 = item.ReadString(Models.Metadata.Rom.xxHash364Key),
|
||||
xxHash3128 = item.ReadString(Models.Metadata.Rom.xxHash3128Key),
|
||||
Merge = item.ReadString(Models.Metadata.Rom.MergeKey),
|
||||
Status = item.ReadString(Models.Metadata.Rom.StatusKey),
|
||||
Region = item.ReadString(Models.Metadata.Rom.RegionKey),
|
||||
Flags = item.ReadString(Models.Metadata.Rom.FlagsKey),
|
||||
Offs = item.ReadString(Models.Metadata.Rom.OffsetKey),
|
||||
Serial = item.ReadString(Models.Metadata.Rom.SerialKey),
|
||||
Header = item.ReadString(Models.Metadata.Rom.HeaderKey),
|
||||
Date = item.ReadString(Models.Metadata.Rom.DateKey),
|
||||
Inverted = item.ReadString(Models.Metadata.Rom.InvertedKey),
|
||||
MIA = item.ReadString(Models.Metadata.Rom.MIAKey),
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Sample"/> to <cref="Models.ClrMamePro.Sample"/>
|
||||
/// </summary>
|
||||
private static Sample ConvertFromInternalModel(Models.Metadata.Sample item)
|
||||
{
|
||||
var sample = new Sample
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Sample.NameKey),
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Sound"/> to <cref="Models.ClrMamePro.Sound"/>
|
||||
/// </summary>
|
||||
private static Sound ConvertFromInternalModel(Models.Metadata.Sound item)
|
||||
{
|
||||
var sound = new Sound
|
||||
{
|
||||
Channels = item.ReadString(Models.Metadata.Sound.ChannelsKey),
|
||||
};
|
||||
return sound;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Video"/> to <cref="Models.ClrMamePro.Video"/>
|
||||
/// </summary>
|
||||
private static Video ConvertFromInternalModel(Models.Metadata.Video item)
|
||||
{
|
||||
var video = new Video
|
||||
{
|
||||
Screen = item.ReadString(Models.Metadata.Video.ScreenKey),
|
||||
Orientation = item.ReadString(Models.Metadata.Video.OrientationKey),
|
||||
X = item.ReadString(Models.Metadata.Video.WidthKey),
|
||||
Y = item.ReadString(Models.Metadata.Video.HeightKey),
|
||||
AspectX = item.ReadString(Models.Metadata.Video.AspectXKey),
|
||||
AspectY = item.ReadString(Models.Metadata.Video.AspectYKey),
|
||||
Freq = item.ReadString(Models.Metadata.Video.RefreshKey),
|
||||
};
|
||||
return video;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,381 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class ClrMamePro : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile();
|
||||
|
||||
if (obj?.ClrMamePro != null)
|
||||
metadataFile[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj.ClrMamePro);
|
||||
|
||||
if (obj?.Game != null && obj.Game.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.Where(m => m != null)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.ClrMamePro"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.ClrMamePro.ClrMamePro item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = item.Name,
|
||||
[Models.Metadata.Header.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Header.RootDirKey] = item.RootDir,
|
||||
[Models.Metadata.Header.CategoryKey] = item.Category,
|
||||
[Models.Metadata.Header.VersionKey] = item.Version,
|
||||
[Models.Metadata.Header.DateKey] = item.Date,
|
||||
[Models.Metadata.Header.AuthorKey] = item.Author,
|
||||
[Models.Metadata.Header.HomepageKey] = item.Homepage,
|
||||
[Models.Metadata.Header.UrlKey] = item.Url,
|
||||
[Models.Metadata.Header.CommentKey] = item.Comment,
|
||||
[Models.Metadata.Header.HeaderKey] = item.Header,
|
||||
[Models.Metadata.Header.TypeKey] = item.Type,
|
||||
[Models.Metadata.Header.ForceMergingKey] = item.ForceMerging,
|
||||
[Models.Metadata.Header.ForceZippingKey] = item.ForceZipping,
|
||||
[Models.Metadata.Header.ForcePackingKey] = item.ForcePacking,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.GameBase"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine? ConvertMachineToInternalModel(GameBase? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.ManufacturerKey] = item.Manufacturer,
|
||||
[Models.Metadata.Machine.CategoryKey] = item.Category,
|
||||
[Models.Metadata.Machine.CloneOfKey] = item.CloneOf,
|
||||
[Models.Metadata.Machine.RomOfKey] = item.RomOf,
|
||||
[Models.Metadata.Machine.SampleOfKey] = item.SampleOf,
|
||||
};
|
||||
|
||||
if (item.Release != null && item.Release.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.ReleaseKey] = item.Release
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Media != null && item.Media.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.MediaKey] = item.Media
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Archive != null && item.Archive.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.ArchiveKey] = item.Archive
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Chip != null && item.Chip.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.ChipKey] = item.Chip
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Video != null)
|
||||
{
|
||||
machine[Models.Metadata.Machine.VideoKey] = item.Video
|
||||
.Where(v => v != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Sound != null)
|
||||
machine[Models.Metadata.Machine.SoundKey] = ConvertToInternalModel(item.Sound);
|
||||
|
||||
if (item.Input != null)
|
||||
machine[Models.Metadata.Machine.InputKey] = ConvertToInternalModel(item.Input);
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DipSwitchKey] = item.DipSwitch
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Driver != null)
|
||||
machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Archive"/> to <cref="Models.Metadata.Archive"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Archive ConvertToInternalModel(Archive item)
|
||||
{
|
||||
var archive = new Models.Metadata.Archive
|
||||
{
|
||||
[Models.Metadata.Archive.NameKey] = item.Name,
|
||||
};
|
||||
return archive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.BiosSet"/> to <cref="Models.Metadata.BiosSet"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.BiosSet ConvertToInternalModel(BiosSet item)
|
||||
{
|
||||
var biosset = new Models.Metadata.BiosSet
|
||||
{
|
||||
[Models.Metadata.BiosSet.NameKey] = item.Name,
|
||||
[Models.Metadata.BiosSet.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.BiosSet.DefaultKey] = item.Default,
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Chip"/> to <cref="Models.Metadata.Chip"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Chip ConvertToInternalModel(Chip item)
|
||||
{
|
||||
var chip = new Models.Metadata.Chip
|
||||
{
|
||||
[Models.Metadata.Chip.ChipTypeKey] = item.Type,
|
||||
[Models.Metadata.Chip.NameKey] = item.Name,
|
||||
[Models.Metadata.Chip.FlagsKey] = item.Flags,
|
||||
[Models.Metadata.Chip.ClockKey] = item.Clock,
|
||||
};
|
||||
return chip;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.DipSwitch"/> to <cref="Models.Metadata.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipSwitch ConvertToInternalModel(DipSwitch item)
|
||||
{
|
||||
var dipswitch = new Models.Metadata.DipSwitch
|
||||
{
|
||||
[Models.Metadata.DipSwitch.NameKey] = item.Name,
|
||||
[Models.Metadata.DipSwitch.EntryKey] = item.Entry,
|
||||
[Models.Metadata.DipSwitch.DefaultKey] = item.Default,
|
||||
};
|
||||
return dipswitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Disk"/> to <cref="Models.Metadata.Disk"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Disk ConvertToInternalModel(Disk item)
|
||||
{
|
||||
var disk = new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.Disk.NameKey] = item.Name,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Disk.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Disk.StatusKey] = item.Status,
|
||||
[Models.Metadata.Disk.FlagsKey] = item.Flags,
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Driver"/> to <cref="Models.Metadata.Driver"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Driver ConvertToInternalModel(Driver item)
|
||||
{
|
||||
var driver = new Models.Metadata.Driver
|
||||
{
|
||||
[Models.Metadata.Driver.StatusKey] = item.Status,
|
||||
[Models.Metadata.Driver.ColorKey] = item.Color,
|
||||
[Models.Metadata.Driver.SoundKey] = item.Sound,
|
||||
[Models.Metadata.Driver.PaletteSizeKey] = item.PaletteSize,
|
||||
[Models.Metadata.Driver.BlitKey] = item.Blit,
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Input"/> to <cref="Models.Metadata.Input"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Input ConvertToInternalModel(Input item)
|
||||
{
|
||||
var input = new Models.Metadata.Input
|
||||
{
|
||||
[Models.Metadata.Input.PlayersKey] = item.Players,
|
||||
[Models.Metadata.Input.ControlKey] = item.Control,
|
||||
[Models.Metadata.Input.ButtonsKey] = item.Buttons,
|
||||
[Models.Metadata.Input.CoinsKey] = item.Coins,
|
||||
[Models.Metadata.Input.TiltKey] = item.Tilt,
|
||||
[Models.Metadata.Input.ServiceKey] = item.Service,
|
||||
};
|
||||
return input;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Media"/> to <cref="Models.Metadata.Media"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Media ConvertToInternalModel(Media item)
|
||||
{
|
||||
var media = new Models.Metadata.Media
|
||||
{
|
||||
[Models.Metadata.Media.NameKey] = item.Name,
|
||||
[Models.Metadata.Media.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Media.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Media.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Media.SpamSumKey] = item.SpamSum,
|
||||
};
|
||||
return media;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Release"/> to <cref="Models.Metadata.Release"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Release ConvertToInternalModel(Release item)
|
||||
{
|
||||
var release = new Models.Metadata.Release
|
||||
{
|
||||
[Models.Metadata.Release.NameKey] = item.Name,
|
||||
[Models.Metadata.Release.RegionKey] = item.Region,
|
||||
[Models.Metadata.Release.LanguageKey] = item.Language,
|
||||
[Models.Metadata.Release.DateKey] = item.Date,
|
||||
[Models.Metadata.Release.DefaultKey] = item.Default,
|
||||
};
|
||||
return release;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Rom"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Rom item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Rom.SHA384Key] = item.SHA384,
|
||||
[Models.Metadata.Rom.SHA512Key] = item.SHA512,
|
||||
[Models.Metadata.Rom.SpamSumKey] = item.SpamSum,
|
||||
[Models.Metadata.Rom.xxHash364Key] = item.xxHash364,
|
||||
[Models.Metadata.Rom.xxHash3128Key] = item.xxHash3128,
|
||||
[Models.Metadata.Rom.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Rom.StatusKey] = item.Status,
|
||||
[Models.Metadata.Rom.RegionKey] = item.Region,
|
||||
[Models.Metadata.Rom.FlagsKey] = item.Flags,
|
||||
[Models.Metadata.Rom.OffsetKey] = item.Offs,
|
||||
[Models.Metadata.Rom.SerialKey] = item.Serial,
|
||||
[Models.Metadata.Rom.HeaderKey] = item.Header,
|
||||
[Models.Metadata.Rom.DateKey] = item.Date,
|
||||
[Models.Metadata.Rom.InvertedKey] = item.Inverted,
|
||||
[Models.Metadata.Rom.MIAKey] = item.MIA,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Sample"/> to <cref="Models.Metadata.Sample"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Sample ConvertToInternalModel(Sample item)
|
||||
{
|
||||
var sample = new Models.Metadata.Sample
|
||||
{
|
||||
[Models.Metadata.Sample.NameKey] = item.Name,
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Sound"/> to <cref="Models.Metadata.Sound"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Sound ConvertToInternalModel(Sound item)
|
||||
{
|
||||
var sound = new Models.Metadata.Sound
|
||||
{
|
||||
[Models.Metadata.Sound.ChannelsKey] = item.Channels,
|
||||
};
|
||||
return sound;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.ClrMamePro.Video"/> to <cref="Models.Metadata.Video"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Video ConvertToInternalModel(Video item)
|
||||
{
|
||||
var video = new Models.Metadata.Video
|
||||
{
|
||||
[Models.Metadata.Video.ScreenKey] = item.Screen,
|
||||
[Models.Metadata.Video.OrientationKey] = item.Orientation,
|
||||
[Models.Metadata.Video.WidthKey] = item.X,
|
||||
[Models.Metadata.Video.HeightKey] = item.Y,
|
||||
[Models.Metadata.Video.AspectXKey] = item.AspectX,
|
||||
[Models.Metadata.Video.AspectYKey] = item.AspectY,
|
||||
[Models.Metadata.Video.RefreshKey] = item.Freq,
|
||||
};
|
||||
return video;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class DosCenter : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
if (header != null)
|
||||
metadataFile.DosCenter = ConvertHeaderFromInternalModel(header);
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.DosCenter.DosCenter"/>
|
||||
/// </summary>
|
||||
private static Models.DosCenter.DosCenter ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var dosCenter = new Models.DosCenter.DosCenter
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
Version = item.ReadString(Models.Metadata.Header.VersionKey),
|
||||
Date = item.ReadString(Models.Metadata.Header.DateKey),
|
||||
Author = item.ReadString(Models.Metadata.Header.AuthorKey),
|
||||
Homepage = item.ReadString(Models.Metadata.Header.HomepageKey),
|
||||
Comment = item.ReadString(Models.Metadata.Header.CommentKey),
|
||||
};
|
||||
return dosCenter;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.DosCenter.Game"/>
|
||||
/// </summary>
|
||||
private static Game ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var game = new Game
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Machine.NameKey),
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
game.File = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return game;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.DosCenter.File"/>
|
||||
/// </summary>
|
||||
private static Models.DosCenter.File ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var file = new Models.DosCenter.File
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
Date = item.ReadString(Models.Metadata.Rom.DateKey),
|
||||
};
|
||||
return file;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class DosCenter : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile();
|
||||
|
||||
if (obj?.DosCenter != null)
|
||||
metadataFile[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj.DosCenter);
|
||||
|
||||
if (obj?.Game != null && obj.Game.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.DosCenter.DosCenter"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.DosCenter.DosCenter item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = item.Name,
|
||||
[Models.Metadata.Header.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Header.VersionKey] = item.Version,
|
||||
[Models.Metadata.Header.DateKey] = item.Date,
|
||||
[Models.Metadata.Header.AuthorKey] = item.Author,
|
||||
[Models.Metadata.Header.HomepageKey] = item.Homepage,
|
||||
[Models.Metadata.Header.CommentKey] = item.Comment,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.DosCenter.Game"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Game item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.File != null && item.File.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.File
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.DosCenter.File"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Models.DosCenter.File item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.DateKey] = item.Date,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class EverdriveSMDB : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to an array of <cref="Models.EverdriveSMDB.Row"/>
|
||||
/// </summary>
|
||||
private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null || !roms.Any())
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.EverdriveSMDB.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
SHA256 = item.ReadString(Models.Metadata.Rom.SHA256Key),
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
MD5 = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
CRC32 = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class EverdriveSMDB : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.EverdriveSMDB.MetadataFile"/> to <cref=Models.Metadata."Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel()
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = "Everdrive SMDB",
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.EverdriveSMDB.Row"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Row item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.RomKey] = ConvertToInternalModel(item),
|
||||
};
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.EverdriveSMDB.Row"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Row item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC32,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,240 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Hashfile;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Hashfile : IModelSerializer<Models.Hashfile.Hashfile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Hashfile.Hashfile? Deserialize(Models.Metadata.MetadataFile? obj) => Deserialize(obj, Hash.CRC);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Models.Hashfile.Hashfile? Deserialize(Models.Metadata.MetadataFile? obj, Hash hash)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines == null || !machines.Any())
|
||||
return null;
|
||||
|
||||
var hashfiles = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, hash));
|
||||
|
||||
var sfvs = new List<SFV>();
|
||||
var md5s = new List<MD5>();
|
||||
var sha1s = new List<SHA1>();
|
||||
var sha256s = new List<SHA256>();
|
||||
var sha384s = new List<SHA384>();
|
||||
var sha512s = new List<SHA512>();
|
||||
var spamsums = new List<SpamSum>();
|
||||
|
||||
foreach (var hashfile in hashfiles)
|
||||
{
|
||||
if (hashfile.SFV != null && hashfile.SFV.Any())
|
||||
sfvs.AddRange(hashfile.SFV);
|
||||
if (hashfile.MD5 != null && hashfile.MD5.Any())
|
||||
md5s.AddRange(hashfile.MD5);
|
||||
if (hashfile.SHA1 != null && hashfile.SHA1.Any())
|
||||
sha1s.AddRange(hashfile.SHA1);
|
||||
if (hashfile.SHA256 != null && hashfile.SHA256.Any())
|
||||
sha256s.AddRange(hashfile.SHA256);
|
||||
if (hashfile.SHA384 != null && hashfile.SHA384.Any())
|
||||
sha384s.AddRange(hashfile.SHA384);
|
||||
if (hashfile.SHA512 != null && hashfile.SHA512.Any())
|
||||
sha512s.AddRange(hashfile.SHA512);
|
||||
if (hashfile.SpamSum != null && hashfile.SpamSum.Any())
|
||||
spamsums.AddRange(hashfile.SpamSum);
|
||||
}
|
||||
|
||||
var hashfileItem = new Models.Hashfile.Hashfile();
|
||||
|
||||
if (sfvs.Any())
|
||||
hashfileItem.SFV = sfvs.ToArray();
|
||||
if (md5s.Any())
|
||||
hashfileItem.MD5 = md5s.ToArray();
|
||||
if (sha1s.Any())
|
||||
hashfileItem.SHA1 = sha1s.ToArray();
|
||||
if (sha256s.Any())
|
||||
hashfileItem.SHA256 = sha256s.ToArray();
|
||||
if (sha384s.Any())
|
||||
hashfileItem.SHA384 = sha384s.ToArray();
|
||||
if (sha512s.Any())
|
||||
hashfileItem.SHA512 = sha512s.ToArray();
|
||||
if (spamsums.Any())
|
||||
hashfileItem.SpamSum = spamsums.ToArray();
|
||||
|
||||
return hashfileItem;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.MetadataFile"/> to an array of <cref="Models.Hashfile.Hashfile"/>
|
||||
/// </summary>
|
||||
public static Models.Hashfile.Hashfile[]? ConvertArrayFromInternalModel(Models.Metadata.MetadataFile? item, Hash hash)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var machines = item.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
return machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, hash))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.Hashfile.Hashfile"/>
|
||||
/// </summary>
|
||||
private static Models.Hashfile.Hashfile ConvertMachineFromInternalModel(Models.Metadata.Machine item, Hash hash)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null)
|
||||
return new Models.Hashfile.Hashfile();
|
||||
|
||||
return new Models.Hashfile.Hashfile
|
||||
{
|
||||
SFV = hash == Hash.CRC
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSFV)
|
||||
.ToArray()
|
||||
: null,
|
||||
MD5 = hash == Hash.MD5
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToMD5)
|
||||
.ToArray()
|
||||
: null,
|
||||
SHA1 = hash == Hash.SHA1
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA1)
|
||||
.ToArray()
|
||||
: null,
|
||||
SHA256 = hash == Hash.SHA256
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA256)
|
||||
.ToArray()
|
||||
: null,
|
||||
SHA384 = hash == Hash.SHA384
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA384)
|
||||
.ToArray()
|
||||
: null,
|
||||
SHA512 = hash == Hash.SHA512
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSHA512)
|
||||
.ToArray()
|
||||
: null,
|
||||
SpamSum = hash == Hash.SpamSum
|
||||
? roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToSpamSum)
|
||||
.ToArray()
|
||||
: null,
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.MD5"/>
|
||||
/// </summary>
|
||||
private static MD5 ConvertToMD5(Models.Metadata.Rom item)
|
||||
{
|
||||
var md5 = new MD5
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return md5;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SFV"/>
|
||||
/// </summary>
|
||||
private static SFV ConvertToSFV(Models.Metadata.Rom item)
|
||||
{
|
||||
var sfv = new SFV
|
||||
{
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Hash = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
};
|
||||
return sfv;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SHA1"/>
|
||||
/// </summary>
|
||||
private static SHA1 ConvertToSHA1(Models.Metadata.Rom item)
|
||||
{
|
||||
var sha1 = new SHA1
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return sha1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SHA256"/>
|
||||
/// </summary>
|
||||
private static SHA256 ConvertToSHA256(Models.Metadata.Rom item)
|
||||
{
|
||||
var sha256 = new SHA256
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA256Key),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return sha256;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SHA384"/>
|
||||
/// </summary>
|
||||
private static SHA384 ConvertToSHA384(Models.Metadata.Rom item)
|
||||
{
|
||||
var sha384 = new SHA384
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA384Key),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return sha384;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SHA512"/>
|
||||
/// </summary>
|
||||
private static SHA512 ConvertToSHA512(Models.Metadata.Rom item)
|
||||
{
|
||||
var sha512 = new SHA512
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA512Key),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return sha512;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Hashfile.SpamSum"/>
|
||||
/// </summary>
|
||||
private static SpamSum ConvertToSpamSum(Models.Metadata.Rom item)
|
||||
{
|
||||
var spamsum = new SpamSum
|
||||
{
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SpamSumKey),
|
||||
File = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
};
|
||||
return spamsum;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Hashfile;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Hashfile : IModelSerializer<Models.Hashfile.Hashfile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Models.Hashfile.Hashfile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(),
|
||||
};
|
||||
|
||||
var machine = ConvertMachineToInternalModel(obj);
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = new Models.Metadata.Machine[] { machine };
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.Hashfile"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel()
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = "Hashfile",
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.Hashfile"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Models.Hashfile.Hashfile item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine();
|
||||
|
||||
if (item.SFV != null && item.SFV.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SFV.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.MD5 != null && item.MD5.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.MD5.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA1 != null && item.SHA1.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA1.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA256 != null && item.SHA256.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA256.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA384 != null && item.SHA384.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA384.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SHA512 != null && item.SHA512.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SHA512.Select(ConvertToInternalModel).ToArray();
|
||||
else if (item.SpamSum != null && item.SpamSum.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.SpamSum.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.MD5"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(MD5 item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.MD5Key] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SFV"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SFV item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
[Models.Metadata.Rom.CRCKey] = item.Hash,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SHA1"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SHA1 item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SHA1Key] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SHA256"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SHA256 item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SHA256Key] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SHA384"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SHA384 item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SHA384Key] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SHA512"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SHA512 item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SHA512Key] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Hashfile.SpamSum"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(SpamSum item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.SpamSumKey] = item.Hash,
|
||||
[Models.Metadata.Rom.NameKey] = item.File,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Listrom : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Set = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.Listrom.Set"/>
|
||||
/// </summary>
|
||||
private static Set ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var set = new Set();
|
||||
if (item.ReadString(Models.Metadata.Machine.IsDeviceKey) == "yes")
|
||||
set.Device = item.ReadString(Models.Metadata.Machine.NameKey);
|
||||
else
|
||||
set.Driver = item.ReadString(Models.Metadata.Machine.NameKey);
|
||||
|
||||
var rowItems = new List<Row>();
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null)
|
||||
{
|
||||
rowItems.AddRange(roms.Where(r => r != null).Select(ConvertFromInternalModel));
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null)
|
||||
rowItems.AddRange(disks.Where(d => d != null).Select(ConvertFromInternalModel));
|
||||
|
||||
set.Row = rowItems.ToArray();
|
||||
return set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.Listrom.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Disk item)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
};
|
||||
|
||||
if (item[Models.Metadata.Disk.StatusKey] as string == "nodump")
|
||||
row.NoGoodDumpKnown = true;
|
||||
else if (item[Models.Metadata.Disk.StatusKey] as string == "baddump")
|
||||
row.Bad = true;
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Listrom.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
};
|
||||
|
||||
if (item[Models.Metadata.Rom.StatusKey] as string == "nodump")
|
||||
row.NoGoodDumpKnown = true;
|
||||
else if (item[Models.Metadata.Rom.StatusKey] as string == "baddump")
|
||||
row.Bad = true;
|
||||
|
||||
return row;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Listrom : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(),
|
||||
};
|
||||
|
||||
if (obj?.Set != null && obj.Set.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Set
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listrom.MetadataFile"/> to <cref="Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel()
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = "MAME Listrom",
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listrom.Set"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Set item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine();
|
||||
if (!string.IsNullOrEmpty(item.Device))
|
||||
{
|
||||
machine[Models.Metadata.Machine.NameKey] = item.Device;
|
||||
machine[Models.Metadata.Machine.IsDeviceKey] = "yes";
|
||||
}
|
||||
else
|
||||
{
|
||||
machine[Models.Metadata.Machine.NameKey] = item.Driver;
|
||||
}
|
||||
|
||||
if (item.Row != null && item.Row.Any())
|
||||
{
|
||||
var datItems = new List<Models.Metadata.DatItem>();
|
||||
foreach (var file in item.Row)
|
||||
{
|
||||
datItems.Add(ConvertToInternalModel(file));
|
||||
}
|
||||
|
||||
machine[Models.Metadata.Machine.DiskKey] = datItems.Where(i => i.ReadString(Models.Metadata.DatItem.TypeKey) == "disk")?.ToArray();
|
||||
machine[Models.Metadata.Machine.RomKey] = datItems.Where(i => i.ReadString(Models.Metadata.DatItem.TypeKey) == "rom")?.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listrom.Row"/> to <cref="Models.Metadata.DatItem"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DatItem ConvertToInternalModel(Row item)
|
||||
{
|
||||
if (item.Size == null)
|
||||
{
|
||||
var disk = new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.DatItem.TypeKey] = "disk",
|
||||
[Models.Metadata.Disk.NameKey] = item.Name,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
};
|
||||
|
||||
if (item.NoGoodDumpKnown)
|
||||
disk[Models.Metadata.Disk.StatusKey] = "nodump";
|
||||
else if (item.Bad)
|
||||
disk[Models.Metadata.Disk.StatusKey] = "baddump";
|
||||
|
||||
return disk;
|
||||
}
|
||||
else
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.DatItem.TypeKey] = "rom",
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
};
|
||||
|
||||
if (item.NoGoodDumpKnown)
|
||||
rom[Models.Metadata.Rom.StatusKey] = "nodump";
|
||||
else if (item.Bad)
|
||||
rom[Models.Metadata.Rom.StatusKey] = "baddump";
|
||||
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,823 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listxml;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Listxml : IModelSerializer<Mame, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Mame? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
mame.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return mame;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.MetadataFile"/> to <cref="Models.Listxml.Mame"/>
|
||||
/// </summary>
|
||||
public static Mame? ConvertMameFromInternalModel(Models.Metadata.MetadataFile? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var header = item.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame();
|
||||
|
||||
var machines = item.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
mame.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return mame;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Header"/> to <cref="Models.Listxml.Mame"/>
|
||||
/// </summary>
|
||||
private static Mame ConvertMameFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var mame = new Mame
|
||||
{
|
||||
Build = item.ReadString(Models.Metadata.Header.BuildKey),
|
||||
Debug = item.ReadString(Models.Metadata.Header.DebugKey),
|
||||
MameConfig = item.ReadString(Models.Metadata.Header.MameConfigKey),
|
||||
};
|
||||
|
||||
return mame;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Machine"/> to <cref="Models.Listxml.GameBase"/>
|
||||
/// </summary>
|
||||
internal static GameBase ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var machine = new Machine
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Machine.NameKey),
|
||||
SourceFile = item.ReadString(Models.Metadata.Machine.SourceFileKey),
|
||||
IsBios = item.ReadString(Models.Metadata.Machine.IsBiosKey),
|
||||
IsDevice = item.ReadString(Models.Metadata.Machine.IsDeviceKey),
|
||||
IsMechanical = item.ReadString(Models.Metadata.Machine.IsMechanicalKey),
|
||||
Runnable = item.ReadString(Models.Metadata.Machine.RunnableKey),
|
||||
CloneOf = item.ReadString(Models.Metadata.Machine.CloneOfKey),
|
||||
RomOf = item.ReadString(Models.Metadata.Machine.RomOfKey),
|
||||
SampleOf = item.ReadString(Models.Metadata.Machine.SampleOfKey),
|
||||
Description = item.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
Year = item.ReadString(Models.Metadata.Machine.YearKey),
|
||||
Manufacturer = item.ReadString(Models.Metadata.Machine.ManufacturerKey),
|
||||
History = item.ReadString(Models.Metadata.Machine.HistoryKey),
|
||||
};
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
machine.BiosSet = biosSets
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
machine.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
machine.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var deviceRefs = item.Read<Models.Metadata.DeviceRef[]>(Models.Metadata.Machine.DeviceRefKey);
|
||||
if (deviceRefs != null && deviceRefs.Any())
|
||||
{
|
||||
machine.DeviceRef = deviceRefs
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
machine.Sample = samples
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var chips = item.Read<Models.Metadata.Chip[]>(Models.Metadata.Machine.ChipKey);
|
||||
if (chips != null && chips.Any())
|
||||
{
|
||||
machine.Chip = chips
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var displays = item.Read<Models.Metadata.Display[]>(Models.Metadata.Machine.DisplayKey);
|
||||
if (displays != null && displays.Any())
|
||||
{
|
||||
machine.Display = displays
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var videos = item.Read<Models.Metadata.Video[]>(Models.Metadata.Machine.VideoKey);
|
||||
if (videos != null && videos.Any())
|
||||
{
|
||||
machine.Video = videos
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var sound = item.Read<Models.Metadata.Sound>(Models.Metadata.Machine.SoundKey);
|
||||
if (sound != null)
|
||||
machine.Sound = ConvertFromInternalModel(sound);
|
||||
|
||||
var input = item.Read<Models.Metadata.Input>(Models.Metadata.Machine.InputKey);
|
||||
if (input != null)
|
||||
machine.Input = ConvertFromInternalModel(input);
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Machine.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
machine.DipSwitch = dipSwitches
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var configurations = item.Read<Models.Metadata.Configuration[]>(Models.Metadata.Machine.ConfigurationKey);
|
||||
if (configurations != null && configurations.Any())
|
||||
{
|
||||
machine.Configuration = configurations
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var ports = item.Read<Models.Metadata.Port[]>(Models.Metadata.Machine.PortKey);
|
||||
if (ports != null && ports.Any())
|
||||
{
|
||||
machine.Port = ports
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var adjusters = item.Read<Models.Metadata.Adjuster[]>(Models.Metadata.Machine.AdjusterKey);
|
||||
if (adjusters != null && adjusters.Any())
|
||||
{
|
||||
machine.Adjuster = adjusters
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
machine.Driver = ConvertFromInternalModel(driver);
|
||||
|
||||
var features = item.Read<Models.Metadata.Feature[]>(Models.Metadata.Machine.FeatureKey);
|
||||
if (features != null && features.Any())
|
||||
{
|
||||
machine.Feature = features
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var devices = item.Read<Models.Metadata.Device[]>(Models.Metadata.Machine.DeviceKey);
|
||||
if (devices != null && devices.Any())
|
||||
{
|
||||
machine.Device = devices
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var slots = item.Read<Models.Metadata.Slot[]>(Models.Metadata.Machine.SlotKey);
|
||||
if (slots != null && slots.Any())
|
||||
{
|
||||
machine.Slot = slots
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var softwareLists = item.Read<Models.Metadata.SoftwareList[]>(Models.Metadata.Machine.SoftwareListKey);
|
||||
if (softwareLists != null && softwareLists.Any())
|
||||
{
|
||||
machine.SoftwareList = softwareLists
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var ramOptions = item.Read<Models.Metadata.RamOption[]>(Models.Metadata.Machine.RamOptionKey);
|
||||
if (ramOptions != null && ramOptions.Any())
|
||||
{
|
||||
machine.RamOption = ramOptions
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Adjuster"/> to <cref="Models.Listxml.Adjuster"/>
|
||||
/// </summary>
|
||||
private static Adjuster ConvertFromInternalModel(Models.Metadata.Adjuster item)
|
||||
{
|
||||
var adjuster = new Adjuster
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Adjuster.NameKey),
|
||||
Default = item.ReadString(Models.Metadata.Adjuster.DefaultKey),
|
||||
};
|
||||
|
||||
var condition = item.Read<Models.Metadata.Condition>(Models.Metadata.Adjuster.ConditionKey);
|
||||
if (condition != null)
|
||||
adjuster.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
return adjuster;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Analog"/> to <cref="Models.Listxml.Analog"/>
|
||||
/// </summary>
|
||||
private static Analog ConvertFromInternalModel(Models.Metadata.Analog item)
|
||||
{
|
||||
var analog = new Analog
|
||||
{
|
||||
Mask = item.ReadString(Models.Metadata.Analog.MaskKey),
|
||||
};
|
||||
return analog;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.BiosSet"/> to <cref="Models.Listxml.BiosSet"/>
|
||||
/// </summary>
|
||||
private static BiosSet ConvertFromInternalModel(Models.Metadata.BiosSet item)
|
||||
{
|
||||
var biosset = new BiosSet
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.BiosSet.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.BiosSet.DescriptionKey),
|
||||
Default = item.ReadString(Models.Metadata.BiosSet.DefaultKey),
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Chip"/> to <cref="Models.Listxml.Chip"/>
|
||||
/// </summary>
|
||||
private static Chip ConvertFromInternalModel(Models.Metadata.Chip item)
|
||||
{
|
||||
var chip = new Chip
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Chip.NameKey),
|
||||
Tag = item.ReadString(Models.Metadata.Chip.TagKey),
|
||||
Type = item.ReadString(Models.Metadata.Chip.ChipTypeKey),
|
||||
SoundOnly = item.ReadString(Models.Metadata.Chip.SoundOnlyKey),
|
||||
Clock = item.ReadString(Models.Metadata.Chip.ClockKey),
|
||||
};
|
||||
return chip;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Condition"/> to <cref="Models.Listxml.Condition"/>
|
||||
/// </summary>
|
||||
private static Condition ConvertFromInternalModel(Models.Metadata.Condition item)
|
||||
{
|
||||
var condition = new Condition
|
||||
{
|
||||
Tag = item.ReadString(Models.Metadata.Condition.TagKey),
|
||||
Mask = item.ReadString(Models.Metadata.Condition.MaskKey),
|
||||
Relation = item.ReadString(Models.Metadata.Condition.RelationKey),
|
||||
Value = item.ReadString(Models.Metadata.Condition.ValueKey),
|
||||
};
|
||||
return condition;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Configuration"/> to <cref="Models.Listxml.Configuration"/>
|
||||
/// </summary>
|
||||
private static Configuration ConvertFromInternalModel(Models.Metadata.Configuration item)
|
||||
{
|
||||
var configuration = new Configuration
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Configuration.NameKey),
|
||||
Tag = item.ReadString(Models.Metadata.Configuration.TagKey),
|
||||
Mask = item.ReadString(Models.Metadata.Configuration.MaskKey),
|
||||
};
|
||||
|
||||
var condition = item.Read<Models.Metadata.Condition>(Models.Metadata.Configuration.ConditionKey);
|
||||
if (condition != null)
|
||||
configuration.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
var confLocations = item.Read<Models.Metadata.ConfLocation[]>(Models.Metadata.Configuration.ConfLocationKey);
|
||||
if (confLocations != null && confLocations.Any())
|
||||
{
|
||||
configuration.ConfLocation = confLocations
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var confSettings = item.Read<Models.Metadata.ConfSetting[]>(Models.Metadata.Configuration.ConfSettingKey);
|
||||
if (confSettings != null && confSettings.Any())
|
||||
{
|
||||
configuration.ConfSetting = confSettings
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return configuration;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.ConfLocation"/> to <cref="Models.Listxml.ConfLocation"/>
|
||||
/// </summary>
|
||||
private static ConfLocation ConvertFromInternalModel(Models.Metadata.ConfLocation item)
|
||||
{
|
||||
var confLocation = new ConfLocation
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.ConfLocation.NameKey),
|
||||
Number = item.ReadString(Models.Metadata.ConfLocation.NumberKey),
|
||||
Inverted = item.ReadString(Models.Metadata.ConfLocation.InvertedKey),
|
||||
};
|
||||
return confLocation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.ConfSetting"/> to <cref="Models.Listxml.ConfSetting"/>
|
||||
/// </summary>
|
||||
private static ConfSetting ConvertFromInternalModel(Models.Metadata.ConfSetting item)
|
||||
{
|
||||
var confSetting = new ConfSetting
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.ConfSetting.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.ConfSetting.ValueKey),
|
||||
Default = item.ReadString(Models.Metadata.ConfSetting.DefaultKey),
|
||||
};
|
||||
|
||||
var condition = item.Read<Models.Metadata.Condition>(Models.Metadata.ConfSetting.ConditionKey);
|
||||
if (condition != null)
|
||||
confSetting.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
return confSetting;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Control"/> to <cref="Models.Listxml.Control"/>
|
||||
/// </summary>
|
||||
private static Control ConvertFromInternalModel(Models.Metadata.Control item)
|
||||
{
|
||||
var control = new Control
|
||||
{
|
||||
Type = item.ReadString(Models.Metadata.Control.ControlTypeKey),
|
||||
Player = item.ReadString(Models.Metadata.Control.PlayerKey),
|
||||
Buttons = item.ReadString(Models.Metadata.Control.ButtonsKey),
|
||||
ReqButtons = item.ReadString(Models.Metadata.Control.ReqButtonsKey),
|
||||
Minimum = item.ReadString(Models.Metadata.Control.MinimumKey),
|
||||
Maximum = item.ReadString(Models.Metadata.Control.MaximumKey),
|
||||
Sensitivity = item.ReadString(Models.Metadata.Control.SensitivityKey),
|
||||
KeyDelta = item.ReadString(Models.Metadata.Control.KeyDeltaKey),
|
||||
Reverse = item.ReadString(Models.Metadata.Control.ReverseKey),
|
||||
Ways = item.ReadString(Models.Metadata.Control.WaysKey),
|
||||
Ways2 = item.ReadString(Models.Metadata.Control.Ways2Key),
|
||||
Ways3 = item.ReadString(Models.Metadata.Control.Ways3Key),
|
||||
};
|
||||
return control;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Device"/> to <cref="Models.Listxml.Device"/>
|
||||
/// </summary>
|
||||
private static Device ConvertFromInternalModel(Models.Metadata.Device item)
|
||||
{
|
||||
var device = new Device
|
||||
{
|
||||
Type = item.ReadString(Models.Metadata.Device.DeviceTypeKey),
|
||||
Tag = item.ReadString(Models.Metadata.Device.TagKey),
|
||||
FixedImage = item.ReadString(Models.Metadata.Device.FixedImageKey),
|
||||
Mandatory = item.ReadString(Models.Metadata.Device.MandatoryKey),
|
||||
Interface = item.ReadString(Models.Metadata.Device.InterfaceKey),
|
||||
};
|
||||
|
||||
var instance = item.Read<Models.Metadata.Instance>(Models.Metadata.Device.InstanceKey);
|
||||
if (instance != null)
|
||||
device.Instance = ConvertFromInternalModel(instance);
|
||||
|
||||
var extensions = item.Read<Models.Metadata.Extension[]>(Models.Metadata.Device.ExtensionKey);
|
||||
if (extensions != null && extensions.Any())
|
||||
{
|
||||
device.Extension = extensions
|
||||
.Where(e => e != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DeviceRef"/> to <cref="Models.Listxml.DeviceRef"/>
|
||||
/// </summary>
|
||||
private static DeviceRef ConvertFromInternalModel(Models.Metadata.DeviceRef item)
|
||||
{
|
||||
var deviceRef = new DeviceRef
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DeviceRef.NameKey),
|
||||
};
|
||||
return deviceRef;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipLocation"/> to <cref="Models.Listxml.DipLocation"/>
|
||||
/// </summary>
|
||||
private static DipLocation ConvertFromInternalModel(Models.Metadata.DipLocation item)
|
||||
{
|
||||
var dipLocation = new DipLocation
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipLocation.NameKey),
|
||||
Number = item.ReadString(Models.Metadata.DipLocation.NumberKey),
|
||||
Inverted = item.ReadString(Models.Metadata.DipLocation.InvertedKey),
|
||||
};
|
||||
return dipLocation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipSwitch"/> to <cref="Models.Listxml.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static DipSwitch ConvertFromInternalModel(Models.Metadata.DipSwitch item)
|
||||
{
|
||||
var dipSwitch = new DipSwitch
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipSwitch.NameKey),
|
||||
Tag = item.ReadString(Models.Metadata.DipSwitch.TagKey),
|
||||
Mask = item.ReadString(Models.Metadata.DipSwitch.MaskKey),
|
||||
};
|
||||
|
||||
var condition = item.Read<Models.Metadata.Condition>(Models.Metadata.DipSwitch.ConditionKey);
|
||||
if (condition != null)
|
||||
dipSwitch.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
var dipLocations = item.Read<Models.Metadata.DipLocation[]>(Models.Metadata.DipSwitch.DipLocationKey);
|
||||
if (dipLocations != null && dipLocations.Any())
|
||||
{
|
||||
dipSwitch.DipLocation = dipLocations
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var dipValues = item.Read<Models.Metadata.DipValue[]>(Models.Metadata.DipSwitch.DipValueKey);
|
||||
if (dipValues != null && dipValues.Any())
|
||||
{
|
||||
dipSwitch.DipValue = dipValues
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipValue"/> to <cref="Models.Listxml.DipValue"/>
|
||||
/// </summary>
|
||||
private static DipValue ConvertFromInternalModel(Models.Metadata.DipValue item)
|
||||
{
|
||||
var dipValue = new DipValue
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipValue.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.DipValue.ValueKey),
|
||||
Default = item.ReadString(Models.Metadata.DipValue.DefaultKey),
|
||||
};
|
||||
|
||||
var condition = item.Read<Models.Metadata.Condition>(Models.Metadata.DipValue.ConditionKey);
|
||||
if (condition != null)
|
||||
dipValue.Condition = ConvertFromInternalModel(condition);
|
||||
|
||||
return dipValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.Listxml.Disk"/>
|
||||
/// </summary>
|
||||
private static Disk ConvertFromInternalModel(Models.Metadata.Disk item)
|
||||
{
|
||||
var disk = new Disk
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
Merge = item.ReadString(Models.Metadata.Disk.MergeKey),
|
||||
Region = item.ReadString(Models.Metadata.Disk.RegionKey),
|
||||
Index = item.ReadString(Models.Metadata.Disk.IndexKey),
|
||||
Writable = item.ReadString(Models.Metadata.Disk.WritableKey),
|
||||
Status = item.ReadString(Models.Metadata.Disk.StatusKey),
|
||||
Optional = item.ReadString(Models.Metadata.Disk.OptionalKey),
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Display"/> to <cref="Models.Listxml.Display"/>
|
||||
/// </summary>
|
||||
private static Display ConvertFromInternalModel(Models.Metadata.Display item)
|
||||
{
|
||||
var display = new Display
|
||||
{
|
||||
Tag = item.ReadString(Models.Metadata.Display.TagKey),
|
||||
Type = item.ReadString(Models.Metadata.Display.DisplayTypeKey),
|
||||
Rotate = item.ReadString(Models.Metadata.Display.RotateKey),
|
||||
FlipX = item.ReadString(Models.Metadata.Display.FlipXKey),
|
||||
Width = item.ReadString(Models.Metadata.Display.WidthKey),
|
||||
Height = item.ReadString(Models.Metadata.Display.HeightKey),
|
||||
Refresh = item.ReadString(Models.Metadata.Display.RefreshKey),
|
||||
PixClock = item.ReadString(Models.Metadata.Display.PixClockKey),
|
||||
HTotal = item.ReadString(Models.Metadata.Display.HTotalKey),
|
||||
HBEnd = item.ReadString(Models.Metadata.Display.HBEndKey),
|
||||
HBStart = item.ReadString(Models.Metadata.Display.HBStartKey),
|
||||
VTotal = item.ReadString(Models.Metadata.Display.VTotalKey),
|
||||
VBEnd = item.ReadString(Models.Metadata.Display.VBEndKey),
|
||||
VBStart = item.ReadString(Models.Metadata.Display.VBStartKey),
|
||||
};
|
||||
return display;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Driver"/> to <cref="Models.Listxml.Driver"/>
|
||||
/// </summary>
|
||||
private static Driver ConvertFromInternalModel(Models.Metadata.Driver item)
|
||||
{
|
||||
var driver = new Driver
|
||||
{
|
||||
Status = item.ReadString(Models.Metadata.Driver.StatusKey),
|
||||
Color = item.ReadString(Models.Metadata.Driver.ColorKey),
|
||||
Sound = item.ReadString(Models.Metadata.Driver.SoundKey),
|
||||
PaletteSize = item.ReadString(Models.Metadata.Driver.PaletteSizeKey),
|
||||
Emulation = item.ReadString(Models.Metadata.Driver.EmulationKey),
|
||||
Cocktail = item.ReadString(Models.Metadata.Driver.CocktailKey),
|
||||
SaveState = item.ReadString(Models.Metadata.Driver.SaveStateKey),
|
||||
RequiresArtwork = item.ReadString(Models.Metadata.Driver.RequiresArtworkKey),
|
||||
Unofficial = item.ReadString(Models.Metadata.Driver.UnofficialKey),
|
||||
NoSoundHardware = item.ReadString(Models.Metadata.Driver.NoSoundHardwareKey),
|
||||
Incomplete = item.ReadString(Models.Metadata.Driver.IncompleteKey),
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Extension"/> to <cref="Models.Listxml.Extension"/>
|
||||
/// </summary>
|
||||
private static Extension ConvertFromInternalModel(Models.Metadata.Extension item)
|
||||
{
|
||||
var extension = new Extension
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Extension.NameKey),
|
||||
};
|
||||
return extension;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Feature"/> to <cref="Models.Listxml.Feature"/>
|
||||
/// </summary>
|
||||
private static Feature ConvertFromInternalModel(Models.Metadata.Feature item)
|
||||
{
|
||||
var feature = new Feature
|
||||
{
|
||||
Type = item.ReadString(Models.Metadata.Feature.FeatureTypeKey),
|
||||
Status = item.ReadString(Models.Metadata.Feature.StatusKey),
|
||||
Overall = item.ReadString(Models.Metadata.Feature.OverallKey),
|
||||
};
|
||||
return feature;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Input"/> to <cref="Models.Listxml.Input"/>
|
||||
/// </summary>
|
||||
private static Input ConvertFromInternalModel(Models.Metadata.Input item)
|
||||
{
|
||||
var input = new Input
|
||||
{
|
||||
Service = item.ReadString(Models.Metadata.Input.ServiceKey),
|
||||
Tilt = item.ReadString(Models.Metadata.Input.TiltKey),
|
||||
Players = item.ReadString(Models.Metadata.Input.PlayersKey),
|
||||
ControlAttr = item.ReadString(Models.Metadata.Input.ControlKey),
|
||||
Buttons = item.ReadString(Models.Metadata.Input.ButtonsKey),
|
||||
Coins = item.ReadString(Models.Metadata.Input.CoinsKey),
|
||||
};
|
||||
|
||||
var controls = item.Read<Models.Metadata.Control[]>(Models.Metadata.Input.ControlKey);
|
||||
if (controls != null && controls.Any())
|
||||
{
|
||||
input.Control = controls
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Instance"/> to <cref="Models.Listxml.Instance"/>
|
||||
/// </summary>
|
||||
private static Instance ConvertFromInternalModel(Models.Metadata.Instance item)
|
||||
{
|
||||
var instance = new Instance
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Instance.NameKey),
|
||||
BriefName = item.ReadString(Models.Metadata.Instance.BriefNameKey),
|
||||
};
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Port"/> to <cref="Models.Listxml.Port"/>
|
||||
/// </summary>
|
||||
private static Port ConvertFromInternalModel(Models.Metadata.Port item)
|
||||
{
|
||||
var port = new Port
|
||||
{
|
||||
Tag = item.ReadString(Models.Metadata.Port.TagKey),
|
||||
};
|
||||
|
||||
var analogs = item.Read<Models.Metadata.Analog[]>(Models.Metadata.Port.AnalogKey);
|
||||
if (analogs != null && analogs.Any())
|
||||
{
|
||||
port.Analog = analogs
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.RamOption"/> to <cref="Models.Listxml.RamOption"/>
|
||||
/// </summary>
|
||||
private static RamOption ConvertFromInternalModel(Models.Metadata.RamOption item)
|
||||
{
|
||||
var ramOption = new RamOption
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.RamOption.NameKey),
|
||||
Default = item.ReadString(Models.Metadata.RamOption.DefaultKey),
|
||||
Content = item.ReadString(Models.Metadata.RamOption.ContentKey),
|
||||
};
|
||||
return ramOption;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Listxml.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var rom = new Rom
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Bios = item.ReadString(Models.Metadata.Rom.BiosKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
Merge = item.ReadString(Models.Metadata.Rom.MergeKey),
|
||||
Region = item.ReadString(Models.Metadata.Rom.RegionKey),
|
||||
Offset = item.ReadString(Models.Metadata.Rom.OffsetKey),
|
||||
Status = item.ReadString(Models.Metadata.Rom.StatusKey),
|
||||
Optional = item.ReadString(Models.Metadata.Rom.OptionalKey),
|
||||
Dispose = item.ReadString(Models.Metadata.Rom.DisposeKey),
|
||||
SoundOnly = item.ReadString(Models.Metadata.Rom.SoundOnlyKey),
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Sample"/> to <cref="Models.Listxml.Sample"/>
|
||||
/// </summary>
|
||||
private static Sample ConvertFromInternalModel(Models.Metadata.Sample item)
|
||||
{
|
||||
var sample = new Sample
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Sample.NameKey),
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Slot"/> to <cref="Models.Listxml.Slot"/>
|
||||
/// </summary>
|
||||
private static Slot ConvertFromInternalModel(Models.Metadata.Slot item)
|
||||
{
|
||||
var slot = new Slot
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Slot.NameKey),
|
||||
};
|
||||
|
||||
var slotOptions = item.Read<Models.Metadata.SlotOption[]>(Models.Metadata.Slot.SlotOptionKey);
|
||||
if (slotOptions != null && slotOptions.Any())
|
||||
{
|
||||
slot.SlotOption = slotOptions
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return slot;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.SlotOption"/> to <cref="Models.Listxml.SlotOption"/>
|
||||
/// </summary>
|
||||
private static SlotOption ConvertFromInternalModel(Models.Metadata.SlotOption item)
|
||||
{
|
||||
var slotOption = new SlotOption
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.SlotOption.NameKey),
|
||||
DevName = item.ReadString(Models.Metadata.SlotOption.DevNameKey),
|
||||
Default = item.ReadString(Models.Metadata.SlotOption.DefaultKey),
|
||||
};
|
||||
return slotOption;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.SoftwareList"/> to <cref="Models.Listxml.SoftwareList"/>
|
||||
/// </summary>
|
||||
private static Models.Listxml.SoftwareList ConvertFromInternalModel(Models.Metadata.SoftwareList item)
|
||||
{
|
||||
var softwareList = new Models.Listxml.SoftwareList
|
||||
{
|
||||
Tag = item.ReadString(Models.Metadata.SoftwareList.TagKey),
|
||||
Name = item.ReadString(Models.Metadata.SoftwareList.NameKey),
|
||||
Status = item.ReadString(Models.Metadata.SoftwareList.StatusKey),
|
||||
Filter = item.ReadString(Models.Metadata.SoftwareList.FilterKey),
|
||||
};
|
||||
return softwareList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Sound"/> to <cref="Models.Listxml.Sound"/>
|
||||
/// </summary>
|
||||
private static Sound ConvertFromInternalModel(Models.Metadata.Sound item)
|
||||
{
|
||||
var sound = new Sound
|
||||
{
|
||||
Channels = item.ReadString(Models.Metadata.Sound.ChannelsKey),
|
||||
};
|
||||
return sound;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Video"/> to <cref="Models.Listxml.Video"/>
|
||||
/// </summary>
|
||||
private static Video ConvertFromInternalModel(Models.Metadata.Video item)
|
||||
{
|
||||
var video = new Video
|
||||
{
|
||||
Screen = item.ReadString(Models.Metadata.Video.ScreenKey),
|
||||
Orientation = item.ReadString(Models.Metadata.Video.OrientationKey),
|
||||
Width = item.ReadString(Models.Metadata.Video.WidthKey),
|
||||
Height = item.ReadString(Models.Metadata.Video.HeightKey),
|
||||
AspectX = item.ReadString(Models.Metadata.Video.AspectXKey),
|
||||
AspectY = item.ReadString(Models.Metadata.Video.AspectYKey),
|
||||
Refresh = item.ReadString(Models.Metadata.Video.RefreshKey),
|
||||
};
|
||||
return video;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,766 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Listxml;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Listxml : IModelSerializer<Mame, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Mame? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Game != null && item.Game.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Mame"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Mame item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.BuildKey] = item.Build,
|
||||
[Models.Metadata.Header.DebugKey] = item.Debug,
|
||||
[Models.Metadata.Header.MameConfigKey] = item.MameConfig,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.GameBase"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
internal static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
[Models.Metadata.Machine.SourceFileKey] = item.SourceFile,
|
||||
[Models.Metadata.Machine.IsBiosKey] = item.IsBios,
|
||||
[Models.Metadata.Machine.IsDeviceKey] = item.IsDevice,
|
||||
[Models.Metadata.Machine.IsMechanicalKey] = item.IsMechanical,
|
||||
[Models.Metadata.Machine.RunnableKey] = item.Runnable,
|
||||
[Models.Metadata.Machine.CloneOfKey] = item.CloneOf,
|
||||
[Models.Metadata.Machine.RomOfKey] = item.RomOf,
|
||||
[Models.Metadata.Machine.SampleOfKey] = item.SampleOf,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.ManufacturerKey] = item.Manufacturer,
|
||||
[Models.Metadata.Machine.HistoryKey] = item.History,
|
||||
};
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.DeviceRef != null && item.DeviceRef.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DeviceRefKey] = item.DeviceRef
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Chip != null && item.Chip.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.ChipKey] = item.Chip
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Display != null && item.Display.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DisplayKey] = item.Display
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Video != null && item.Video.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.VideoKey] = item.Video
|
||||
.Where(v => v != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Sound != null)
|
||||
machine[Models.Metadata.Machine.SoundKey] = ConvertToInternalModel(item.Sound);
|
||||
|
||||
if (item.Input != null)
|
||||
machine[Models.Metadata.Machine.InputKey] = ConvertToInternalModel(item.Input);
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DipSwitchKey] = item.DipSwitch
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Configuration != null && item.Configuration.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.ConfigurationKey] = item.Configuration
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Port != null && item.Port.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.PortKey] = item.Port
|
||||
.Where(p => p != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Adjuster != null && item.Adjuster.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.AdjusterKey] = item.Adjuster
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Driver != null)
|
||||
machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
|
||||
|
||||
if (item.Feature != null && item.Feature.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.FeatureKey] = item.Feature
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Device != null && item.Device.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DeviceKey] = item.Device
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.Slot != null && item.Slot.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.SlotKey] = item.Slot
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.SoftwareList != null && item.SoftwareList.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.SoftwareListKey] = item.SoftwareList
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.RamOption != null && item.RamOption.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.RamOptionKey] = item.RamOption
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Adjuster"/> to <cref="Models.Metadata.Adjuster"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Adjuster ConvertToInternalModel(Adjuster item)
|
||||
{
|
||||
var adjuster = new Models.Metadata.Adjuster
|
||||
{
|
||||
[Models.Metadata.Adjuster.NameKey] = item.Name,
|
||||
[Models.Metadata.Adjuster.DefaultKey] = item.Default,
|
||||
};
|
||||
|
||||
if (item.Condition != null)
|
||||
adjuster[Models.Metadata.Adjuster.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
return adjuster;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Analog"/> to <cref="Models.Metadata.Analog"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Analog ConvertToInternalModel(Analog item)
|
||||
{
|
||||
var analog = new Models.Metadata.Analog
|
||||
{
|
||||
[Models.Metadata.Analog.MaskKey] = item.Mask,
|
||||
};
|
||||
return analog;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.BiosSet"/> to <cref="Models.Metadata.BiosSet"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.BiosSet ConvertToInternalModel(BiosSet item)
|
||||
{
|
||||
var biosset = new Models.Metadata.BiosSet
|
||||
{
|
||||
[Models.Metadata.BiosSet.NameKey] = item.Name,
|
||||
[Models.Metadata.BiosSet.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.BiosSet.DefaultKey] = item.Default,
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Chip"/> to <cref="Models.Metadata.Chip"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Chip ConvertToInternalModel(Chip item)
|
||||
{
|
||||
var chip = new Models.Metadata.Chip
|
||||
{
|
||||
[Models.Metadata.Chip.NameKey] = item.Name,
|
||||
[Models.Metadata.Chip.TagKey] = item.Tag,
|
||||
[Models.Metadata.Chip.ChipTypeKey] = item.Type,
|
||||
[Models.Metadata.Chip.SoundOnlyKey] = item.SoundOnly,
|
||||
[Models.Metadata.Chip.ClockKey] = item.Clock,
|
||||
};
|
||||
return chip;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Condition"/> to <cref="Models.Metadata.Condition"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Condition ConvertToInternalModel(Condition item)
|
||||
{
|
||||
var condition = new Models.Metadata.Condition
|
||||
{
|
||||
[Models.Metadata.Condition.TagKey] = item.Tag,
|
||||
[Models.Metadata.Condition.MaskKey] = item.Mask,
|
||||
[Models.Metadata.Condition.RelationKey] = item.Relation,
|
||||
[Models.Metadata.Condition.ValueKey] = item.Value,
|
||||
};
|
||||
return condition;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Configuration"/> to <cref="Models.Metadata.Configuration"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Configuration ConvertToInternalModel(Configuration item)
|
||||
{
|
||||
var configuration = new Models.Metadata.Configuration
|
||||
{
|
||||
[Models.Metadata.Configuration.NameKey] = item.Name,
|
||||
[Models.Metadata.Configuration.TagKey] = item.Tag,
|
||||
[Models.Metadata.Configuration.MaskKey] = item.Mask,
|
||||
};
|
||||
|
||||
if (item.Condition != null)
|
||||
configuration[Models.Metadata.Configuration.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
if (item.ConfLocation != null && item.ConfLocation.Any())
|
||||
{
|
||||
configuration[Models.Metadata.Configuration.ConfLocationKey] = item.ConfLocation
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.ConfSetting != null && item.ConfSetting.Any())
|
||||
{
|
||||
configuration[Models.Metadata.Configuration.ConfSettingKey] = item.ConfSetting
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return configuration;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.ConfLocation"/> to <cref="Models.Metadata.ConfLocation"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.ConfLocation ConvertToInternalModel(ConfLocation item)
|
||||
{
|
||||
var confLocation = new Models.Metadata.ConfLocation
|
||||
{
|
||||
[Models.Metadata.ConfLocation.NameKey] = item.Name,
|
||||
[Models.Metadata.ConfLocation.NumberKey] = item.Number,
|
||||
[Models.Metadata.ConfLocation.InvertedKey] = item.Inverted,
|
||||
};
|
||||
return confLocation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.ConfSetting"/> to <cref="Models.Metadata.ConfSetting"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.ConfSetting ConvertToInternalModel(ConfSetting item)
|
||||
{
|
||||
var confSetting = new Models.Metadata.ConfSetting
|
||||
{
|
||||
[Models.Metadata.ConfSetting.NameKey] = item.Name,
|
||||
[Models.Metadata.ConfSetting.ValueKey] = item.Value,
|
||||
[Models.Metadata.ConfSetting.DefaultKey] = item.Default,
|
||||
};
|
||||
|
||||
if (item.Condition != null)
|
||||
confSetting[Models.Metadata.ConfSetting.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
return confSetting;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Control"/> to <cref="Models.Metadata.Control"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Control ConvertToInternalModel(Control item)
|
||||
{
|
||||
var control = new Models.Metadata.Control
|
||||
{
|
||||
[Models.Metadata.Control.ControlTypeKey] = item.Type,
|
||||
[Models.Metadata.Control.PlayerKey] = item.Player,
|
||||
[Models.Metadata.Control.ButtonsKey] = item.Buttons,
|
||||
[Models.Metadata.Control.ReqButtonsKey] = item.ReqButtons,
|
||||
[Models.Metadata.Control.MinimumKey] = item.Minimum,
|
||||
[Models.Metadata.Control.MaximumKey] = item.Maximum,
|
||||
[Models.Metadata.Control.SensitivityKey] = item.Sensitivity,
|
||||
[Models.Metadata.Control.KeyDeltaKey] = item.KeyDelta,
|
||||
[Models.Metadata.Control.ReverseKey] = item.Reverse,
|
||||
[Models.Metadata.Control.WaysKey] = item.Ways,
|
||||
[Models.Metadata.Control.Ways2Key] = item.Ways2,
|
||||
[Models.Metadata.Control.Ways3Key] = item.Ways3,
|
||||
};
|
||||
return control;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Device"/> to <cref="Models.Metadata.Device"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Device ConvertToInternalModel(Device item)
|
||||
{
|
||||
var device = new Models.Metadata.Device
|
||||
{
|
||||
[Models.Metadata.Device.DeviceTypeKey] = item.Type,
|
||||
[Models.Metadata.Device.TagKey] = item.Tag,
|
||||
[Models.Metadata.Device.FixedImageKey] = item.FixedImage,
|
||||
[Models.Metadata.Device.MandatoryKey] = item.Mandatory,
|
||||
[Models.Metadata.Device.InterfaceKey] = item.Interface,
|
||||
};
|
||||
|
||||
if (item.Instance != null)
|
||||
device[Models.Metadata.Device.InstanceKey] = ConvertToInternalModel(item.Instance);
|
||||
|
||||
if (item.Extension != null && item.Extension.Any())
|
||||
{
|
||||
device[Models.Metadata.Device.ExtensionKey] = item.Extension
|
||||
.Where(e => e != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.DeviceRef"/> to <cref="Models.Metadata.DeviceRef"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DeviceRef ConvertToInternalModel(DeviceRef item)
|
||||
{
|
||||
var deviceRef = new Models.Metadata.DeviceRef
|
||||
{
|
||||
[Models.Metadata.DeviceRef.NameKey] = item.Name,
|
||||
};
|
||||
return deviceRef;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.DipLocation"/> to <cref="Models.Metadata.DipLocation"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipLocation ConvertToInternalModel(DipLocation item)
|
||||
{
|
||||
var dipLocation = new Models.Metadata.DipLocation
|
||||
{
|
||||
[Models.Metadata.DipLocation.NameKey] = item.Name,
|
||||
[Models.Metadata.DipLocation.NumberKey] = item.Number,
|
||||
[Models.Metadata.DipLocation.InvertedKey] = item.Inverted,
|
||||
};
|
||||
return dipLocation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.DipSwitch"/> to <cref="Models.Metadata.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipSwitch ConvertToInternalModel(DipSwitch item)
|
||||
{
|
||||
var dipSwitch = new Models.Metadata.DipSwitch
|
||||
{
|
||||
[Models.Metadata.DipSwitch.NameKey] = item.Name,
|
||||
[Models.Metadata.DipSwitch.TagKey] = item.Tag,
|
||||
[Models.Metadata.DipSwitch.MaskKey] = item.Mask,
|
||||
};
|
||||
|
||||
if (item.Condition != null)
|
||||
dipSwitch[Models.Metadata.DipSwitch.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
if (item.DipLocation != null && item.DipLocation.Any())
|
||||
{
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipLocationKey] = item.DipLocation
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (item.DipValue != null && item.DipValue.Any())
|
||||
{
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = item.DipValue
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.DipValue"/> to <cref="Models.Metadata.DipValue"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipValue ConvertToInternalModel(DipValue item)
|
||||
{
|
||||
var dipValue = new Models.Metadata.DipValue
|
||||
{
|
||||
[Models.Metadata.DipValue.NameKey] = item.Name,
|
||||
[Models.Metadata.DipValue.ValueKey] = item.Value,
|
||||
[Models.Metadata.DipValue.DefaultKey] = item.Default,
|
||||
};
|
||||
|
||||
if (item.Condition != null)
|
||||
dipValue[Models.Metadata.DipValue.ConditionKey] = ConvertToInternalModel(item.Condition);
|
||||
|
||||
return dipValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Disk"/> to <cref="Models.Metadata.Disk"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Disk ConvertToInternalModel(Disk item)
|
||||
{
|
||||
var disk = new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.Disk.NameKey] = item.Name,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Disk.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Disk.RegionKey] = item.Region,
|
||||
[Models.Metadata.Disk.IndexKey] = item.Index,
|
||||
[Models.Metadata.Disk.WritableKey] = item.Writable,
|
||||
[Models.Metadata.Disk.StatusKey] = item.Status,
|
||||
[Models.Metadata.Disk.OptionalKey] = item.Optional,
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Display"/> to <cref="Models.Metadata.Display"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Display ConvertToInternalModel(Display item)
|
||||
{
|
||||
var display = new Models.Metadata.Display
|
||||
{
|
||||
[Models.Metadata.Display.TagKey] = item.Tag,
|
||||
[Models.Metadata.Display.DisplayTypeKey] = item.Type,
|
||||
[Models.Metadata.Display.RotateKey] = item.Rotate,
|
||||
[Models.Metadata.Display.FlipXKey] = item.FlipX,
|
||||
[Models.Metadata.Display.WidthKey] = item.Width,
|
||||
[Models.Metadata.Display.HeightKey] = item.Height,
|
||||
[Models.Metadata.Display.RefreshKey] = item.Refresh,
|
||||
[Models.Metadata.Display.PixClockKey] = item.PixClock,
|
||||
[Models.Metadata.Display.HTotalKey] = item.HTotal,
|
||||
[Models.Metadata.Display.HBEndKey] = item.HBEnd,
|
||||
[Models.Metadata.Display.HBStartKey] = item.HBStart,
|
||||
[Models.Metadata.Display.VTotalKey] = item.VTotal,
|
||||
[Models.Metadata.Display.VBEndKey] = item.VBEnd,
|
||||
[Models.Metadata.Display.VBStartKey] = item.VBStart,
|
||||
};
|
||||
return display;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Driver"/> to <cref="Models.Metadata.Driver"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Driver ConvertToInternalModel(Driver item)
|
||||
{
|
||||
var driver = new Models.Metadata.Driver
|
||||
{
|
||||
[Models.Metadata.Driver.StatusKey] = item.Status,
|
||||
[Models.Metadata.Driver.ColorKey] = item.Color,
|
||||
[Models.Metadata.Driver.SoundKey] = item.Sound,
|
||||
[Models.Metadata.Driver.PaletteSizeKey] = item.PaletteSize,
|
||||
[Models.Metadata.Driver.EmulationKey] = item.Emulation,
|
||||
[Models.Metadata.Driver.CocktailKey] = item.Cocktail,
|
||||
[Models.Metadata.Driver.SaveStateKey] = item.SaveState,
|
||||
[Models.Metadata.Driver.RequiresArtworkKey] = item.RequiresArtwork,
|
||||
[Models.Metadata.Driver.UnofficialKey] = item.Unofficial,
|
||||
[Models.Metadata.Driver.NoSoundHardwareKey] = item.NoSoundHardware,
|
||||
[Models.Metadata.Driver.IncompleteKey] = item.Incomplete,
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Extension"/> to <cref="Models.Metadata.Extension"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Extension ConvertToInternalModel(Extension item)
|
||||
{
|
||||
var extension = new Models.Metadata.Extension
|
||||
{
|
||||
[Models.Metadata.Extension.NameKey] = item.Name,
|
||||
};
|
||||
return extension;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Feature"/> to <cref="Models.Metadata.Feature"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Feature ConvertToInternalModel(Feature item)
|
||||
{
|
||||
var feature = new Models.Metadata.Feature
|
||||
{
|
||||
[Models.Metadata.Feature.FeatureTypeKey] = item.Type,
|
||||
[Models.Metadata.Feature.StatusKey] = item.Status,
|
||||
[Models.Metadata.Feature.OverallKey] = item.Overall,
|
||||
};
|
||||
return feature;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Input"/> to <cref="Models.Metadata.Input"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Input ConvertToInternalModel(Input item)
|
||||
{
|
||||
var input = new Models.Metadata.Input
|
||||
{
|
||||
[Models.Metadata.Input.ServiceKey] = item.Service,
|
||||
[Models.Metadata.Input.TiltKey] = item.Tilt,
|
||||
[Models.Metadata.Input.PlayersKey] = item.Players,
|
||||
[Models.Metadata.Input.ControlKey] = item.ControlAttr,
|
||||
[Models.Metadata.Input.ButtonsKey] = item.Buttons,
|
||||
[Models.Metadata.Input.CoinsKey] = item.Coins,
|
||||
};
|
||||
|
||||
if (item.Control != null && item.Control.Any())
|
||||
{
|
||||
input[Models.Metadata.Input.ControlKey] = item.Control
|
||||
.Where(c => c != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Instance"/> to <cref="Models.Metadata.Instance"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Instance ConvertToInternalModel(Instance item)
|
||||
{
|
||||
var instance = new Models.Metadata.Instance
|
||||
{
|
||||
[Models.Metadata.Instance.NameKey] = item.Name,
|
||||
[Models.Metadata.Instance.BriefNameKey] = item.BriefName,
|
||||
};
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Port"/> to <cref="Models.Metadata.Port"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Port ConvertToInternalModel(Port item)
|
||||
{
|
||||
var port = new Models.Metadata.Port
|
||||
{
|
||||
[Models.Metadata.Port.TagKey] = item.Tag,
|
||||
};
|
||||
|
||||
if (item.Analog != null && item.Analog.Any())
|
||||
{
|
||||
port[Models.Metadata.Port.AnalogKey] = item.Analog
|
||||
.Where(a => a != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.RamOption"/> to <cref="Models.Metadata.RamOption"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.RamOption ConvertToInternalModel(RamOption item)
|
||||
{
|
||||
var ramOption = new Models.Metadata.RamOption
|
||||
{
|
||||
[Models.Metadata.RamOption.NameKey] = item.Name,
|
||||
[Models.Metadata.RamOption.DefaultKey] = item.Default,
|
||||
[Models.Metadata.RamOption.ContentKey] = item.Content,
|
||||
};
|
||||
return ramOption;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Rom"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Rom item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.BiosKey] = item.Bios,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Rom.RegionKey] = item.Region,
|
||||
[Models.Metadata.Rom.OffsetKey] = item.Offset,
|
||||
[Models.Metadata.Rom.StatusKey] = item.Status,
|
||||
[Models.Metadata.Rom.OptionalKey] = item.Optional,
|
||||
[Models.Metadata.Rom.DisposeKey] = item.Dispose,
|
||||
[Models.Metadata.Rom.SoundOnlyKey] = item.SoundOnly,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Sample"/> to <cref="Models.Metadata.Sample"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Sample ConvertToInternalModel(Sample item)
|
||||
{
|
||||
var sample = new Models.Metadata.Sample
|
||||
{
|
||||
[Models.Metadata.Sample.NameKey] = item.Name,
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Slot"/> to <cref="Models.Metadata.Slot"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Slot ConvertToInternalModel(Slot item)
|
||||
{
|
||||
var slot = new Models.Metadata.Slot
|
||||
{
|
||||
[Models.Metadata.Slot.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.SlotOption != null && item.SlotOption.Any())
|
||||
{
|
||||
slot[Models.Metadata.Slot.SlotOptionKey] = item.SlotOption
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return slot;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.SlotOption"/> to <cref="Models.Metadata.SlotOption"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.SlotOption ConvertToInternalModel(SlotOption item)
|
||||
{
|
||||
var slotOption = new Models.Metadata.SlotOption
|
||||
{
|
||||
[Models.Metadata.SlotOption.NameKey] = item.Name,
|
||||
[Models.Metadata.SlotOption.DevNameKey] = item.DevName,
|
||||
[Models.Metadata.SlotOption.DefaultKey] = item.Default,
|
||||
};
|
||||
return slotOption;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.SoftwareList"/> to <cref="Models.Metadata.SoftwareList"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.SoftwareList ConvertToInternalModel(Models.Listxml.SoftwareList item)
|
||||
{
|
||||
var softwareList = new Models.Metadata.SoftwareList
|
||||
{
|
||||
[Models.Metadata.SoftwareList.TagKey] = item.Tag,
|
||||
[Models.Metadata.SoftwareList.NameKey] = item.Name,
|
||||
[Models.Metadata.SoftwareList.StatusKey] = item.Status,
|
||||
[Models.Metadata.SoftwareList.FilterKey] = item.Filter,
|
||||
};
|
||||
return softwareList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Sound"/> to <cref="Models.Metadata.Sound"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Sound ConvertToInternalModel(Sound item)
|
||||
{
|
||||
var sound = new Models.Metadata.Sound
|
||||
{
|
||||
[Models.Metadata.Sound.ChannelsKey] = item.Channels,
|
||||
};
|
||||
return sound;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.Video"/> to <cref="Models.Metadata.Video"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Video ConvertToInternalModel(Video item)
|
||||
{
|
||||
var video = new Models.Metadata.Video
|
||||
{
|
||||
[Models.Metadata.Video.ScreenKey] = item.Screen,
|
||||
[Models.Metadata.Video.OrientationKey] = item.Orientation,
|
||||
[Models.Metadata.Video.WidthKey] = item.Width,
|
||||
[Models.Metadata.Video.HeightKey] = item.Height,
|
||||
[Models.Metadata.Video.AspectXKey] = item.AspectX,
|
||||
[Models.Metadata.Video.AspectYKey] = item.AspectY,
|
||||
[Models.Metadata.Video.RefreshKey] = item.Refresh,
|
||||
};
|
||||
return video;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,382 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Logiqx : IModelSerializer<Datafile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Datafile? Deserialize(Models.Metadata.MetadataFile? obj) => Deserialize(obj, false);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Datafile? Deserialize(Models.Metadata.MetadataFile? obj, bool game)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var datafile = new Datafile
|
||||
{
|
||||
Build = obj.ReadString(Models.Metadata.Header.BuildKey),
|
||||
Debug = obj.ReadString(Models.Metadata.Header.DebugKey),
|
||||
SchemaLocation = obj.ReadString(Models.Metadata.Header.SchemaLocationKey),
|
||||
};
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
if (header != null)
|
||||
datafile.Header = ConvertHeaderFromInternalModel(header);
|
||||
|
||||
// TODO: Handle Dir items - Currently need to be generated from the machines
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
datafile.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(machine => ConvertMachineFromInternalModel(machine, game))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return datafile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.Logiqx.Header"/>
|
||||
/// </summary>
|
||||
private static Header ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var header = new Header
|
||||
{
|
||||
Id = item.ReadString(Models.Metadata.Header.IdKey),
|
||||
Name = item.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
RootDir = item.ReadString(Models.Metadata.Header.RootDirKey),
|
||||
Category = item.ReadString(Models.Metadata.Header.CategoryKey),
|
||||
Version = item.ReadString(Models.Metadata.Header.VersionKey),
|
||||
Date = item.ReadString(Models.Metadata.Header.DateKey),
|
||||
Author = item.ReadString(Models.Metadata.Header.AuthorKey),
|
||||
Email = item.ReadString(Models.Metadata.Header.EmailKey),
|
||||
Homepage = item.ReadString(Models.Metadata.Header.HomepageKey),
|
||||
Url = item.ReadString(Models.Metadata.Header.UrlKey),
|
||||
Comment = item.ReadString(Models.Metadata.Header.CommentKey),
|
||||
Type = item.ReadString(Models.Metadata.Header.TypeKey),
|
||||
};
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.HeaderKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ForceMergingKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ForceNodumpKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ForcePackingKey))
|
||||
{
|
||||
header.ClrMamePro = new Models.Logiqx.ClrMamePro
|
||||
{
|
||||
Header = item.ReadString(Models.Metadata.Header.HeaderKey),
|
||||
ForceMerging = item.ReadString(Models.Metadata.Header.ForceMergingKey),
|
||||
ForceNodump = item.ReadString(Models.Metadata.Header.ForceNodumpKey),
|
||||
ForcePacking = item.ReadString(Models.Metadata.Header.ForcePackingKey),
|
||||
};
|
||||
}
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.PluginKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.RomModeKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.BiosModeKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.SampleModeKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.LockRomModeKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.LockBiosModeKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.LockSampleModeKey))
|
||||
{
|
||||
header.RomCenter = new Models.Logiqx.RomCenter
|
||||
{
|
||||
Plugin = item.ReadString(Models.Metadata.Header.PluginKey),
|
||||
RomMode = item.ReadString(Models.Metadata.Header.RomModeKey),
|
||||
BiosMode = item.ReadString(Models.Metadata.Header.BiosModeKey),
|
||||
SampleMode = item.ReadString(Models.Metadata.Header.SampleModeKey),
|
||||
LockRomMode = item.ReadString(Models.Metadata.Header.LockRomModeKey),
|
||||
LockBiosMode = item.ReadString(Models.Metadata.Header.LockBiosModeKey),
|
||||
LockSampleMode = item.ReadString(Models.Metadata.Header.LockSampleModeKey),
|
||||
};
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.Logiqx.GameBase"/>
|
||||
/// </summary>
|
||||
private static GameBase ConvertMachineFromInternalModel(Models.Metadata.Machine item, bool game = false)
|
||||
{
|
||||
GameBase gameBase = game ? new Game() : new Machine();
|
||||
|
||||
gameBase.Name = item.ReadString(Models.Metadata.Machine.NameKey);
|
||||
gameBase.SourceFile = item.ReadString(Models.Metadata.Machine.SourceFileKey);
|
||||
gameBase.IsBios = item.ReadString(Models.Metadata.Machine.IsBiosKey);
|
||||
gameBase.IsDevice = item.ReadString(Models.Metadata.Machine.IsDeviceKey);
|
||||
gameBase.IsMechanical = item.ReadString(Models.Metadata.Machine.IsMechanicalKey);
|
||||
gameBase.CloneOf = item.ReadString(Models.Metadata.Machine.CloneOfKey);
|
||||
gameBase.RomOf = item.ReadString(Models.Metadata.Machine.RomOfKey);
|
||||
gameBase.SampleOf = item.ReadString(Models.Metadata.Machine.SampleOfKey);
|
||||
gameBase.Board = item.ReadString(Models.Metadata.Machine.BoardKey);
|
||||
gameBase.RebuildTo = item.ReadString(Models.Metadata.Machine.RebuildToKey);
|
||||
gameBase.Id = item.ReadString(Models.Metadata.Machine.IdKey);
|
||||
gameBase.CloneOfId = item.ReadString(Models.Metadata.Machine.CloneOfIdKey);
|
||||
gameBase.Runnable = item.ReadString(Models.Metadata.Machine.RunnableKey);
|
||||
gameBase.Comment = item.ReadStringArray(Models.Metadata.Machine.CommentKey);
|
||||
gameBase.Description = item.ReadString(Models.Metadata.Machine.DescriptionKey);
|
||||
gameBase.Year = item.ReadString(Models.Metadata.Machine.YearKey);
|
||||
gameBase.Manufacturer = item.ReadString(Models.Metadata.Machine.ManufacturerKey);
|
||||
gameBase.Publisher = item.ReadString(Models.Metadata.Machine.PublisherKey);
|
||||
gameBase.Category = item.ReadStringArray(Models.Metadata.Machine.CategoryKey);
|
||||
|
||||
var trurip = item.Read<Trurip>(Models.Metadata.Machine.TruripKey);
|
||||
if (trurip != null)
|
||||
gameBase.Trurip = trurip;
|
||||
|
||||
var releases = item.Read<Models.Metadata.Release[]>(Models.Metadata.Machine.ReleaseKey);
|
||||
if (releases != null && releases.Any())
|
||||
{
|
||||
gameBase.Release = releases
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var biosSets = item.Read<Models.Metadata.BiosSet[]>(Models.Metadata.Machine.BiosSetKey);
|
||||
if (biosSets != null && biosSets.Any())
|
||||
{
|
||||
gameBase.BiosSet = biosSets
|
||||
.Where(b => b != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
gameBase.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
gameBase.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var medias = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (medias != null && medias.Any())
|
||||
{
|
||||
gameBase.Media = medias
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var deviceRefs = item.Read<Models.Metadata.DeviceRef[]>(Models.Metadata.Machine.DeviceRefKey);
|
||||
if (deviceRefs != null && deviceRefs.Any())
|
||||
{
|
||||
gameBase.DeviceRef = deviceRefs
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var samples = item.Read<Models.Metadata.Sample[]>(Models.Metadata.Machine.SampleKey);
|
||||
if (samples != null && samples.Any())
|
||||
{
|
||||
gameBase.Sample = samples
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var archives = item.Read<Models.Metadata.Archive[]>(Models.Metadata.Machine.ArchiveKey);
|
||||
if (archives != null && archives.Any())
|
||||
{
|
||||
gameBase.Archive = archives
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var driver = item.Read<Models.Metadata.Driver>(Models.Metadata.Machine.DriverKey);
|
||||
if (driver != null)
|
||||
gameBase.Driver = ConvertFromInternalModel(driver);
|
||||
|
||||
var softwareLists = item.Read<Models.Metadata.SoftwareList[]>(Models.Metadata.Machine.SoftwareListKey);
|
||||
if (softwareLists != null && softwareLists.Any())
|
||||
{
|
||||
gameBase.SoftwareList = softwareLists
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return gameBase;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Archive"/> to <cref="Models.Logiqx.Archive"/>
|
||||
/// </summary>
|
||||
private static Archive ConvertFromInternalModel(Models.Metadata.Archive item)
|
||||
{
|
||||
var archive = new Archive
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Archive.NameKey),
|
||||
};
|
||||
return archive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.BiosSet"/> to <cref="Models.Logiqx.BiosSet"/>
|
||||
/// </summary>
|
||||
private static BiosSet ConvertFromInternalModel(Models.Metadata.BiosSet item)
|
||||
{
|
||||
var biosset = new BiosSet
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.BiosSet.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.BiosSet.DescriptionKey),
|
||||
Default = item.ReadString(Models.Metadata.BiosSet.DefaultKey),
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DeviceRef"/> to <cref="Models.Logiqx.DeviceRef"/>
|
||||
/// </summary>
|
||||
private static DeviceRef ConvertFromInternalModel(Models.Metadata.DeviceRef item)
|
||||
{
|
||||
var deviceRef = new DeviceRef
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipSwitch.NameKey),
|
||||
};
|
||||
return deviceRef;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.Logiqx.Disk"/>
|
||||
/// </summary>
|
||||
private static Disk ConvertFromInternalModel(Models.Metadata.Disk item)
|
||||
{
|
||||
var disk = new Disk
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
Merge = item.ReadString(Models.Metadata.Disk.MergeKey),
|
||||
Status = item.ReadString(Models.Metadata.Disk.StatusKey),
|
||||
Region = item.ReadString(Models.Metadata.Disk.RegionKey),
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Driver"/> to <cref="Models.Logiqx.Driver"/>
|
||||
/// </summary>
|
||||
private static Driver ConvertFromInternalModel(Models.Metadata.Driver item)
|
||||
{
|
||||
var driver = new Driver
|
||||
{
|
||||
Status = item.ReadString(Models.Metadata.Driver.StatusKey),
|
||||
Emulation = item.ReadString(Models.Metadata.Driver.EmulationKey),
|
||||
Cocktail = item.ReadString(Models.Metadata.Driver.CocktailKey),
|
||||
SaveState = item.ReadString(Models.Metadata.Driver.SaveStateKey),
|
||||
RequiresArtwork = item.ReadString(Models.Metadata.Driver.RequiresArtworkKey),
|
||||
Unofficial = item.ReadString(Models.Metadata.Driver.UnofficialKey),
|
||||
NoSoundHardware = item.ReadString(Models.Metadata.Driver.NoSoundHardwareKey),
|
||||
Incomplete = item.ReadString(Models.Metadata.Driver.IncompleteKey),
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Media"/> to <cref="Models.Logiqx.Media"/>
|
||||
/// </summary>
|
||||
private static Media ConvertFromInternalModel(Models.Metadata.Media item)
|
||||
{
|
||||
var media = new Media
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Media.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Media.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Media.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Media.SHA256Key),
|
||||
SpamSum = item.ReadString(Models.Metadata.Media.SpamSumKey),
|
||||
};
|
||||
return media;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Release"/> to <cref="Models.Logiqx.Release"/>
|
||||
/// </summary>
|
||||
private static Release ConvertFromInternalModel(Models.Metadata.Release item)
|
||||
{
|
||||
var release = new Release
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Release.NameKey),
|
||||
Region = item.ReadString(Models.Metadata.Release.RegionKey),
|
||||
Language = item.ReadString(Models.Metadata.Release.LanguageKey),
|
||||
Date = item.ReadString(Models.Metadata.Release.DateKey),
|
||||
Default = item.ReadString(Models.Metadata.Release.DefaultKey),
|
||||
};
|
||||
return release;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.Logiqx.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var rom = new Rom
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Rom.SHA256Key),
|
||||
SHA384 = item.ReadString(Models.Metadata.Rom.SHA384Key),
|
||||
SHA512 = item.ReadString(Models.Metadata.Rom.SHA512Key),
|
||||
SpamSum = item.ReadString(Models.Metadata.Rom.SpamSumKey),
|
||||
xxHash364 = item.ReadString(Models.Metadata.Rom.xxHash364Key),
|
||||
xxHash3128 = item.ReadString(Models.Metadata.Rom.xxHash3128Key),
|
||||
Merge = item.ReadString(Models.Metadata.Rom.MergeKey),
|
||||
Status = item.ReadString(Models.Metadata.Rom.StatusKey),
|
||||
Serial = item.ReadString(Models.Metadata.Rom.SerialKey),
|
||||
Header = item.ReadString(Models.Metadata.Rom.HeaderKey),
|
||||
Date = item.ReadString(Models.Metadata.Rom.DateKey),
|
||||
Inverted = item.ReadString(Models.Metadata.Rom.InvertedKey),
|
||||
MIA = item.ReadString(Models.Metadata.Rom.MIAKey),
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Sample"/> to <cref="Models.Logiqx.Sample"/>
|
||||
/// </summary>
|
||||
private static Sample ConvertFromInternalModel(Models.Metadata.Sample item)
|
||||
{
|
||||
var sample = new Sample
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Sample.NameKey),
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.SoftwareList"/> to <cref="Models.Logiqx.SoftwareList"/>
|
||||
/// </summary>
|
||||
private static Models.Logiqx.SoftwareList ConvertFromInternalModel(Models.Metadata.SoftwareList item)
|
||||
{
|
||||
var softwareList = new Models.Logiqx.SoftwareList
|
||||
{
|
||||
Tag = item.ReadString(Models.Metadata.SoftwareList.TagKey),
|
||||
Name = item.ReadString(Models.Metadata.SoftwareList.NameKey),
|
||||
Status = item.ReadString(Models.Metadata.SoftwareList.StatusKey),
|
||||
Filter = item.ReadString(Models.Metadata.SoftwareList.FilterKey),
|
||||
};
|
||||
return softwareList;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,344 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.Logiqx;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class Logiqx : IModelSerializer<Datafile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
public Models.Metadata.MetadataFile? Serialize(Datafile? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
var machines = new List<Models.Metadata.Machine>();
|
||||
|
||||
if (item.Game != null && item.Game.Any())
|
||||
{
|
||||
machines.AddRange(item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel));
|
||||
}
|
||||
|
||||
if (item.Dir != null && item.Dir.Any())
|
||||
{
|
||||
machines.AddRange(item.Dir
|
||||
.Where(d => d != null)
|
||||
.SelectMany(ConvertDirToInternalModel));
|
||||
}
|
||||
|
||||
if (machines.Any())
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = machines.ToArray();
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Datafile"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Datafile item)
|
||||
{
|
||||
var header = item.Header != null ? ConvertHeaderToInternalModel(item.Header) : new Models.Metadata.Header();
|
||||
|
||||
header[Models.Metadata.Header.BuildKey] = item.Build;
|
||||
header[Models.Metadata.Header.DebugKey] = item.Debug;
|
||||
header[Models.Metadata.Header.SchemaLocationKey] = item.SchemaLocation;
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Header"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Header item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.IdKey] = item.Id,
|
||||
[Models.Metadata.Header.NameKey] = item.Name,
|
||||
[Models.Metadata.Header.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Header.RootDirKey] = item.RootDir,
|
||||
[Models.Metadata.Header.CategoryKey] = item.Category,
|
||||
[Models.Metadata.Header.VersionKey] = item.Version,
|
||||
[Models.Metadata.Header.DateKey] = item.Date,
|
||||
[Models.Metadata.Header.AuthorKey] = item.Author,
|
||||
[Models.Metadata.Header.EmailKey] = item.Email,
|
||||
[Models.Metadata.Header.HomepageKey] = item.Homepage,
|
||||
[Models.Metadata.Header.UrlKey] = item.Url,
|
||||
[Models.Metadata.Header.CommentKey] = item.Comment,
|
||||
[Models.Metadata.Header.TypeKey] = item.Type,
|
||||
};
|
||||
|
||||
if (item.ClrMamePro != null)
|
||||
{
|
||||
header[Models.Metadata.Header.HeaderKey] = item.ClrMamePro.Header;
|
||||
header[Models.Metadata.Header.ForceMergingKey] = item.ClrMamePro.ForceMerging;
|
||||
header[Models.Metadata.Header.ForceNodumpKey] = item.ClrMamePro.ForceNodump;
|
||||
header[Models.Metadata.Header.ForcePackingKey] = item.ClrMamePro.ForcePacking;
|
||||
}
|
||||
|
||||
if (item.RomCenter != null)
|
||||
{
|
||||
header[Models.Metadata.Header.PluginKey] = item.RomCenter.Plugin;
|
||||
header[Models.Metadata.Header.RomModeKey] = item.RomCenter.RomMode;
|
||||
header[Models.Metadata.Header.BiosModeKey] = item.RomCenter.BiosMode;
|
||||
header[Models.Metadata.Header.SampleModeKey] = item.RomCenter.SampleMode;
|
||||
header[Models.Metadata.Header.LockRomModeKey] = item.RomCenter.LockRomMode;
|
||||
header[Models.Metadata.Header.LockBiosModeKey] = item.RomCenter.LockBiosMode;
|
||||
header[Models.Metadata.Header.LockSampleModeKey] = item.RomCenter.LockSampleMode;
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Dir"/> to an array of <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item)
|
||||
{
|
||||
if (item.Game == null || !item.Game.Any())
|
||||
return [];
|
||||
|
||||
return item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(game =>
|
||||
{
|
||||
var machine = ConvertMachineToInternalModel(game);
|
||||
machine[Models.Metadata.Machine.DirNameKey] = item.Name;
|
||||
return machine;
|
||||
})
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.GameBase"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
[Models.Metadata.Machine.SourceFileKey] = item.SourceFile,
|
||||
[Models.Metadata.Machine.IsBiosKey] = item.IsBios,
|
||||
[Models.Metadata.Machine.IsDeviceKey] = item.IsDevice,
|
||||
[Models.Metadata.Machine.IsMechanicalKey] = item.IsMechanical,
|
||||
[Models.Metadata.Machine.CloneOfKey] = item.CloneOf,
|
||||
[Models.Metadata.Machine.RomOfKey] = item.RomOf,
|
||||
[Models.Metadata.Machine.SampleOfKey] = item.SampleOf,
|
||||
[Models.Metadata.Machine.BoardKey] = item.Board,
|
||||
[Models.Metadata.Machine.RebuildToKey] = item.RebuildTo,
|
||||
[Models.Metadata.Machine.IdKey] = item.Id,
|
||||
[Models.Metadata.Machine.CloneOfIdKey] = item.CloneOfId,
|
||||
[Models.Metadata.Machine.RunnableKey] = item.Runnable,
|
||||
[Models.Metadata.Machine.CommentKey] = item.Comment,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.ManufacturerKey] = item.Manufacturer,
|
||||
[Models.Metadata.Machine.PublisherKey] = item.Publisher,
|
||||
[Models.Metadata.Machine.CategoryKey] = item.Category,
|
||||
[Models.Metadata.Machine.TruripKey] = item.Trurip,
|
||||
};
|
||||
|
||||
if (item.Release != null && item.Release.Any())
|
||||
machine[Models.Metadata.Machine.ReleaseKey] = item.Release.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.BiosSet != null && item.BiosSet.Any())
|
||||
machine[Models.Metadata.Machine.BiosSetKey] = item.BiosSet.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
machine[Models.Metadata.Machine.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Media != null && item.Media.Any())
|
||||
machine[Models.Metadata.Machine.MediaKey] = item.Media.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.DeviceRef != null && item.DeviceRef.Any())
|
||||
machine[Models.Metadata.Machine.DeviceRefKey] = item.DeviceRef.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Sample != null && item.Sample.Any())
|
||||
machine[Models.Metadata.Machine.SampleKey] = item.Sample.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Archive != null && item.Archive.Any())
|
||||
machine[Models.Metadata.Machine.ArchiveKey] = item.Archive.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Driver != null)
|
||||
machine[Models.Metadata.Machine.DriverKey] = ConvertToInternalModel(item.Driver);
|
||||
|
||||
if (item.SoftwareList != null && item.SoftwareList.Any())
|
||||
machine[Models.Metadata.Machine.SoftwareListKey] = item.SoftwareList.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Archive"/> to <cref="Models.Metadata.Archive"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Archive ConvertToInternalModel(Archive item)
|
||||
{
|
||||
var archive = new Models.Metadata.Archive
|
||||
{
|
||||
[Models.Metadata.Archive.NameKey] = item.Name,
|
||||
};
|
||||
return archive;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.BiosSet"/> to <cref="Models.Metadata.BiosSet"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.BiosSet ConvertToInternalModel(BiosSet item)
|
||||
{
|
||||
var biosset = new Models.Metadata.BiosSet
|
||||
{
|
||||
[Models.Metadata.BiosSet.NameKey] = item.Name,
|
||||
[Models.Metadata.BiosSet.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.BiosSet.DefaultKey] = item.Default,
|
||||
};
|
||||
return biosset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.DeviceRef"/> to <cref="Models.Metadata.DeviceRef"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DeviceRef ConvertToInternalModel(DeviceRef item)
|
||||
{
|
||||
var deviceRef = new Models.Metadata.DeviceRef
|
||||
{
|
||||
[Models.Metadata.DeviceRef.NameKey] = item.Name,
|
||||
};
|
||||
return deviceRef;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Disk"/> to <cref="Models.Metadata.Disk"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Disk ConvertToInternalModel(Disk item)
|
||||
{
|
||||
var disk = new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.Disk.NameKey] = item.Name,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Disk.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Disk.StatusKey] = item.Status,
|
||||
[Models.Metadata.Disk.RegionKey] = item.Region,
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Driver"/> to <cref="Models.Metadata.Driver"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Driver ConvertToInternalModel(Driver item)
|
||||
{
|
||||
var driver = new Models.Metadata.Driver
|
||||
{
|
||||
[Models.Metadata.Driver.StatusKey] = item.Status,
|
||||
[Models.Metadata.Driver.EmulationKey] = item.Emulation,
|
||||
[Models.Metadata.Driver.CocktailKey] = item.Cocktail,
|
||||
[Models.Metadata.Driver.SaveStateKey] = item.SaveState,
|
||||
[Models.Metadata.Driver.RequiresArtworkKey] = item.RequiresArtwork,
|
||||
[Models.Metadata.Driver.UnofficialKey] = item.Unofficial,
|
||||
[Models.Metadata.Driver.NoSoundHardwareKey] = item.NoSoundHardware,
|
||||
[Models.Metadata.Driver.IncompleteKey] = item.Incomplete,
|
||||
};
|
||||
return driver;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Media"/> to <cref="Models.Metadata.Media"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Media ConvertToInternalModel(Media item)
|
||||
{
|
||||
var media = new Models.Metadata.Media
|
||||
{
|
||||
[Models.Metadata.Media.NameKey] = item.Name,
|
||||
[Models.Metadata.Media.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Media.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Media.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Media.SpamSumKey] = item.SpamSum,
|
||||
};
|
||||
return media;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Release"/> to <cref="Models.Metadata.Release"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Release ConvertToInternalModel(Release item)
|
||||
{
|
||||
var release = new Models.Metadata.Release
|
||||
{
|
||||
[Models.Metadata.Release.NameKey] = item.Name,
|
||||
[Models.Metadata.Release.RegionKey] = item.Region,
|
||||
[Models.Metadata.Release.LanguageKey] = item.Language,
|
||||
[Models.Metadata.Release.DateKey] = item.Date,
|
||||
[Models.Metadata.Release.DefaultKey] = item.Default,
|
||||
};
|
||||
return release;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Rom"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Rom item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Rom.SHA384Key] = item.SHA384,
|
||||
[Models.Metadata.Rom.SHA512Key] = item.SHA512,
|
||||
[Models.Metadata.Rom.SpamSumKey] = item.SpamSum,
|
||||
[Models.Metadata.Rom.xxHash364Key] = item.xxHash364,
|
||||
[Models.Metadata.Rom.xxHash3128Key] = item.xxHash3128,
|
||||
[Models.Metadata.Rom.MergeKey] = item.Merge,
|
||||
[Models.Metadata.Rom.StatusKey] = item.Status,
|
||||
[Models.Metadata.Rom.SerialKey] = item.Serial,
|
||||
[Models.Metadata.Rom.HeaderKey] = item.Header,
|
||||
[Models.Metadata.Rom.DateKey] = item.Date,
|
||||
[Models.Metadata.Rom.InvertedKey] = item.Inverted,
|
||||
[Models.Metadata.Rom.MIAKey] = item.MIA,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.Sample"/> to <cref="Models.Metadata.Sample"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Sample ConvertToInternalModel(Sample item)
|
||||
{
|
||||
var sample = new Models.Metadata.Sample
|
||||
{
|
||||
[Models.Metadata.Sample.NameKey] = item.Name,
|
||||
};
|
||||
return sample;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Logiqx.SoftwareList"/> to <cref="Models.Metadata.SoftwareList"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.SoftwareList ConvertToInternalModel(Models.Logiqx.SoftwareList item)
|
||||
{
|
||||
var softwareList = new Models.Metadata.SoftwareList
|
||||
{
|
||||
[Models.Metadata.SoftwareList.TagKey] = item.Tag,
|
||||
[Models.Metadata.SoftwareList.NameKey] = item.Name,
|
||||
[Models.Metadata.SoftwareList.StatusKey] = item.Status,
|
||||
[Models.Metadata.SoftwareList.FilterKey] = item.Filter,
|
||||
};
|
||||
return softwareList;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class M1 : IModelSerializer<Models.Listxml.M1, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Listxml.M1? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var m1 = header != null ? ConvertM1FromInternalModel(header) : new Models.Listxml.M1();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
m1.Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(Listxml.ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return m1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Models.Metadata.Header"/> to <cref="Models.Listxml.M1"/>
|
||||
/// </summary>
|
||||
private static Models.Listxml.M1 ConvertM1FromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var m1 = new Models.Listxml.M1
|
||||
{
|
||||
Version = item.ReadString(Models.Metadata.Header.VersionKey),
|
||||
};
|
||||
return m1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class M1 : IModelSerializer<Models.Listxml.M1, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Models.Listxml.M1? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Game != null && item.Game.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Game
|
||||
.Where(g => g != null)
|
||||
.Select(Listxml.ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Listxml.M1"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.Listxml.M1 item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.VersionKey] = item.Version,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OfflineList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OfflineList : IModelSerializer<Dat, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Dat? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var dat = header != null ? ConvertHeaderFromInternalModel(header) : new Dat();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
dat.Games = new Games
|
||||
{
|
||||
Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray()
|
||||
};
|
||||
}
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.OfflineList.Dat"/>
|
||||
/// </summary>
|
||||
private static Dat ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var dat = new Dat
|
||||
{
|
||||
NoNamespaceSchemaLocation = item.ReadString(Models.Metadata.Header.SchemaLocationKey),
|
||||
};
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.NameKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ImFolderKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.DatVersionKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.SystemKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ScreenshotsWidthKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ScreenshotsHeightKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.InfosKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.CanOpenKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.NewDatKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.SearchKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.RomTitleKey))
|
||||
{
|
||||
dat.Configuration = new Configuration
|
||||
{
|
||||
DatName = item.ReadString(Models.Metadata.Header.NameKey),
|
||||
ImFolder = item.ReadString(Models.Metadata.Header.ImFolderKey),
|
||||
DatVersion = item.ReadString(Models.Metadata.Header.DatVersionKey),
|
||||
System = item.ReadString(Models.Metadata.Header.SystemKey),
|
||||
ScreenshotsWidth = item.ReadString(Models.Metadata.Header.ScreenshotsWidthKey),
|
||||
ScreenshotsHeight = item.ReadString(Models.Metadata.Header.ScreenshotsHeightKey),
|
||||
Infos = item.Read<Infos>(Models.Metadata.Header.InfosKey),
|
||||
CanOpen = item.Read<CanOpen>(Models.Metadata.Header.CanOpenKey),
|
||||
NewDat = item.Read<NewDat>(Models.Metadata.Header.NewDatKey),
|
||||
Search = item.Read<Search>(Models.Metadata.Header.SearchKey),
|
||||
RomTitle = item.ReadString(Models.Metadata.Header.RomTitleKey),
|
||||
};
|
||||
}
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.ImagesKey))
|
||||
{
|
||||
dat.GUI = new GUI
|
||||
{
|
||||
Images = item.Read<Images>(Models.Metadata.Header.ImagesKey),
|
||||
};
|
||||
}
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.OfflineList.Game"/>
|
||||
/// </summary>
|
||||
private static Game ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var game = new Game
|
||||
{
|
||||
ImageNumber = item.ReadString(Models.Metadata.Machine.ImageNumberKey),
|
||||
ReleaseNumber = item.ReadString(Models.Metadata.Machine.ReleaseNumberKey),
|
||||
Title = item.ReadString(Models.Metadata.Machine.NameKey),
|
||||
SaveType = item.ReadString(Models.Metadata.Machine.SaveTypeKey),
|
||||
Publisher = item.ReadString(Models.Metadata.Machine.PublisherKey),
|
||||
Location = item.ReadString(Models.Metadata.Machine.LocationKey),
|
||||
SourceRom = item.ReadString(Models.Metadata.Machine.SourceRomKey),
|
||||
Language = item.ReadString(Models.Metadata.Machine.LanguageKey),
|
||||
Im1CRC = item.ReadString(Models.Metadata.Machine.Im1CRCKey),
|
||||
Im2CRC = item.ReadString(Models.Metadata.Machine.Im2CRCKey),
|
||||
Comment = item.ReadString(Models.Metadata.Machine.CommentKey),
|
||||
DuplicateID = item.ReadString(Models.Metadata.Machine.DuplicateIDKey),
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
game.RomSize = roms
|
||||
.Select(rom => rom.ReadString(Models.Metadata.Rom.SizeKey))
|
||||
.FirstOrDefault(s => s != null);
|
||||
|
||||
var romCRCs = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
|
||||
game.Files = new Models.OfflineList.Files { RomCRC = romCRCs };
|
||||
}
|
||||
|
||||
return game;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.OfflineList.FileRomCRC"/>
|
||||
/// </summary>
|
||||
private static FileRomCRC ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var fileRomCRC = new FileRomCRC
|
||||
{
|
||||
Extension = item.ReadString(Models.Metadata.Rom.ExtensionKey),
|
||||
Content = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
};
|
||||
return fileRomCRC;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OfflineList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OfflineList : IModelSerializer<Dat, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Dat? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Games?.Game != null && item.Games.Game.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Games.Game
|
||||
.Where(g => g != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.Dat"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Dat item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation,
|
||||
};
|
||||
|
||||
if (item.Configuration != null)
|
||||
{
|
||||
header[Models.Metadata.Header.NameKey] = item.Configuration.DatName;
|
||||
header[Models.Metadata.Header.ImFolderKey] = item.Configuration.ImFolder;
|
||||
header[Models.Metadata.Header.DatVersionKey] = item.Configuration.DatVersion;
|
||||
header[Models.Metadata.Header.SystemKey] = item.Configuration.System;
|
||||
header[Models.Metadata.Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth;
|
||||
header[Models.Metadata.Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight;
|
||||
header[Models.Metadata.Header.InfosKey] = item.Configuration.Infos;
|
||||
header[Models.Metadata.Header.CanOpenKey] = item.Configuration.CanOpen;
|
||||
header[Models.Metadata.Header.NewDatKey] = item.Configuration.NewDat;
|
||||
header[Models.Metadata.Header.SearchKey] = item.Configuration.Search;
|
||||
header[Models.Metadata.Header.RomTitleKey] = item.Configuration.RomTitle;
|
||||
}
|
||||
|
||||
if (item.GUI != null)
|
||||
{
|
||||
header[Models.Metadata.Header.ImagesKey] = item.GUI.Images;
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.Game"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Game item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.ImageNumberKey] = item.ImageNumber,
|
||||
[Models.Metadata.Machine.ReleaseNumberKey] = item.ReleaseNumber,
|
||||
[Models.Metadata.Machine.NameKey] = item.Title,
|
||||
[Models.Metadata.Machine.SaveTypeKey] = item.SaveType,
|
||||
[Models.Metadata.Machine.PublisherKey] = item.Publisher,
|
||||
[Models.Metadata.Machine.LocationKey] = item.Location,
|
||||
[Models.Metadata.Machine.SourceRomKey] = item.SourceRom,
|
||||
[Models.Metadata.Machine.LanguageKey] = item.Language,
|
||||
[Models.Metadata.Machine.Im1CRCKey] = item.Im1CRC,
|
||||
[Models.Metadata.Machine.Im2CRCKey] = item.Im2CRC,
|
||||
[Models.Metadata.Machine.CommentKey] = item.Comment,
|
||||
[Models.Metadata.Machine.DuplicateIDKey] = item.DuplicateID,
|
||||
};
|
||||
|
||||
if (item.Files?.RomCRC != null && item.Files.RomCRC.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.RomKey] = item.Files.RomCRC
|
||||
.Where(r => r != null)
|
||||
.Select(romCRC =>
|
||||
{
|
||||
var rom = ConvertToInternalModel(romCRC);
|
||||
rom[Models.Metadata.Rom.SizeKey] = item.RomSize;
|
||||
return rom;
|
||||
})
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.FileRomCRC"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(FileRomCRC item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.ExtensionKey] = item.Extension,
|
||||
[Models.Metadata.Rom.CRCKey] = item.Content,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OpenMSX;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OpenMSX : IModelSerializer<SoftwareDb, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public SoftwareDb? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var softwareDb = header != null ? ConvertHeaderFromInternalModel(header) : new SoftwareDb();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
softwareDb.Software = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return softwareDb;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.OpenMSX.SoftwareDb"/>
|
||||
/// </summary>
|
||||
private static SoftwareDb ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var softwareDb = new SoftwareDb
|
||||
{
|
||||
Timestamp = item.ReadString(Models.Metadata.Header.TimestampKey),
|
||||
};
|
||||
return softwareDb;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.OpenMSX.Software"/>
|
||||
/// </summary>
|
||||
private static Software ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var game = new Software
|
||||
{
|
||||
Title = item.ReadString(Models.Metadata.Machine.NameKey),
|
||||
GenMSXID = item.ReadString(Models.Metadata.Machine.GenMSXIDKey),
|
||||
System = item.ReadString(Models.Metadata.Machine.SystemKey),
|
||||
Company = item.ReadString(Models.Metadata.Machine.CompanyKey),
|
||||
Year = item.ReadString(Models.Metadata.Machine.YearKey),
|
||||
Country = item.ReadString(Models.Metadata.Machine.CountryKey),
|
||||
};
|
||||
|
||||
var dumps = item.Read<Models.Metadata.Dump[]>(Models.Metadata.Machine.DumpKey);
|
||||
if (dumps != null && dumps.Any())
|
||||
{
|
||||
game.Dump = dumps
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return game;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Dump"/> to <cref="Models.OpenMSX.Dump"/>
|
||||
/// </summary>
|
||||
private static Dump ConvertFromInternalModel(Models.Metadata.Dump item)
|
||||
{
|
||||
var dump = new Dump();
|
||||
|
||||
var original = item.Read<Models.Metadata.Original>(Models.Metadata.Dump.OriginalKey);
|
||||
if (original != null)
|
||||
dump.Original = ConvertFromInternalModel(original);
|
||||
|
||||
var rom = item.Read<Models.Metadata.Rom>(Models.Metadata.Dump.RomKey);
|
||||
if (rom != null)
|
||||
dump.Rom = ConvertRomFromInternalModel(rom);
|
||||
|
||||
var megaRom = item.Read<Models.Metadata.Rom>(Models.Metadata.Dump.MegaRomKey);
|
||||
if (megaRom != null)
|
||||
dump.Rom = ConvertMegaRomFromInternalModel(megaRom);
|
||||
|
||||
var sccPlusCart = item.Read<Models.Metadata.Rom>(Models.Metadata.Dump.SCCPlusCartKey);
|
||||
if (sccPlusCart != null)
|
||||
dump.Rom = ConvertSCCPlusCartFromInternalModel(sccPlusCart);
|
||||
|
||||
return dump;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.OpenMSX.MegaRom"/>
|
||||
/// </summary>
|
||||
private static MegaRom ConvertMegaRomFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var megaRom = new MegaRom
|
||||
{
|
||||
Start = item.ReadString(Models.Metadata.Rom.StartKey),
|
||||
Type = item.ReadString(Models.Metadata.Rom.OpenMSXType),
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
Remark = item.ReadString(Models.Metadata.Rom.RemarkKey),
|
||||
};
|
||||
return megaRom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Original"/> to <cref="Models.OpenMSX.Original"/>
|
||||
/// </summary>
|
||||
private static Original ConvertFromInternalModel(Models.Metadata.Original item)
|
||||
{
|
||||
var original = new Original
|
||||
{
|
||||
Value = item.ReadString(Models.Metadata.Original.ValueKey),
|
||||
Content = item.ReadString(Models.Metadata.Original.ContentKey),
|
||||
};
|
||||
return original;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.OpenMSX.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertRomFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var rom = new Rom
|
||||
{
|
||||
Start = item.ReadString(Models.Metadata.Rom.StartKey),
|
||||
Type = item.ReadString(Models.Metadata.Rom.OpenMSXType),
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
Remark = item.ReadString(Models.Metadata.Rom.RemarkKey),
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.OpenMSX.SCCPlusCart"/>
|
||||
/// </summary>
|
||||
private static SCCPlusCart ConvertSCCPlusCartFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var sccPlusCart = new SCCPlusCart
|
||||
{
|
||||
Start = item.ReadString(Models.Metadata.Rom.StartKey),
|
||||
Type = item.ReadString(Models.Metadata.Rom.OpenMSXType),
|
||||
Hash = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
Remark = item.ReadString(Models.Metadata.Rom.RemarkKey),
|
||||
};
|
||||
return sccPlusCart;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,128 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OpenMSX;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OpenMSX : IModelSerializer<SoftwareDb, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(SoftwareDb? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Software != null && item.Software.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Software
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OpenMSX.SoftwareDb"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
public static Models.Metadata.Header ConvertHeaderToInternalModel(SoftwareDb item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.TimestampKey] = item.Timestamp,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OpenMSX.Software"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
public static Models.Metadata.Machine ConvertMachineToInternalModel(Software item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Title,
|
||||
[Models.Metadata.Machine.GenMSXIDKey] = item.GenMSXID,
|
||||
[Models.Metadata.Machine.SystemKey] = item.System,
|
||||
[Models.Metadata.Machine.CompanyKey] = item.Company,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.CountryKey] = item.Country,
|
||||
};
|
||||
|
||||
if (item.Dump != null && item.Dump.Any())
|
||||
{
|
||||
machine[Models.Metadata.Machine.DumpKey] = item.Dump
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OpenMSX.Dump"/> to <cref="Models.Metadata.Dump"/>
|
||||
/// </summary>
|
||||
public static Models.Metadata.Dump ConvertToInternalModel(Dump item)
|
||||
{
|
||||
var dump = new Models.Metadata.Dump();
|
||||
|
||||
if (item.Original != null)
|
||||
dump[Models.Metadata.Dump.OriginalKey] = ConvertToInternalModel(item.Original);
|
||||
|
||||
if (item.Rom != null)
|
||||
{
|
||||
switch (item.Rom)
|
||||
{
|
||||
case Rom rom:
|
||||
dump[Models.Metadata.Dump.RomKey] = ConvertToInternalModel(rom);
|
||||
break;
|
||||
|
||||
case MegaRom megaRom:
|
||||
dump[Models.Metadata.Dump.MegaRomKey] = ConvertToInternalModel(megaRom);
|
||||
break;
|
||||
|
||||
case SCCPlusCart sccPlusCart:
|
||||
dump[Models.Metadata.Dump.SCCPlusCartKey] = ConvertToInternalModel(sccPlusCart);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return dump;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OpenMSX.Original"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
public static Models.Metadata.Original ConvertToInternalModel(Original item)
|
||||
{
|
||||
var original = new Models.Metadata.Original
|
||||
{
|
||||
[Models.Metadata.Original.ValueKey] = item.Value,
|
||||
[Models.Metadata.Original.ContentKey] = item.Content,
|
||||
};
|
||||
return original;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OpenMSX.RomBase"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
public static Models.Metadata.Rom ConvertToInternalModel(RomBase item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.StartKey] = item.Start,
|
||||
[Models.Metadata.Rom.OpenMSXType] = item.Type,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.Hash,
|
||||
[Models.Metadata.Rom.RemarkKey] = item.Remark,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.RomCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class RomCenter : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Games = new Games
|
||||
{
|
||||
Rom = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(ConvertMachineFromInternalModel)
|
||||
.ToArray()
|
||||
};
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.RomCenter.MetadataFile"/>
|
||||
/// </summary>
|
||||
private static MetadataFile ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var metadataFile = new MetadataFile();
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.AuthorKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.VersionKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.EmailKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.HomepageKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.UrlKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.DateKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.CommentKey))
|
||||
{
|
||||
metadataFile.Credits = new Credits
|
||||
{
|
||||
Author = item.ReadString(Models.Metadata.Header.AuthorKey),
|
||||
Version = item.ReadString(Models.Metadata.Header.VersionKey),
|
||||
Email = item.ReadString(Models.Metadata.Header.EmailKey),
|
||||
Homepage = item.ReadString(Models.Metadata.Header.HomepageKey),
|
||||
Url = item.ReadString(Models.Metadata.Header.UrlKey),
|
||||
Date = item.ReadString(Models.Metadata.Header.DateKey),
|
||||
Comment = item.ReadString(Models.Metadata.Header.CommentKey),
|
||||
};
|
||||
}
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.DatVersionKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.PluginKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.ForceMergingKey))
|
||||
{
|
||||
metadataFile.Dat = new Dat
|
||||
{
|
||||
Version = item.ReadString(Models.Metadata.Header.DatVersionKey),
|
||||
Plugin = item.ReadString(Models.Metadata.Header.PluginKey),
|
||||
Split = item.ReadString(Models.Metadata.Header.ForceMergingKey) == "split" ? "yes" : "no",
|
||||
Merge = item.ReadString(Models.Metadata.Header.ForceMergingKey) == "merge" ? "yes" : "no",
|
||||
};
|
||||
}
|
||||
|
||||
if (item.ContainsKey(Models.Metadata.Header.RefNameKey)
|
||||
|| item.ContainsKey(Models.Metadata.Header.EmulatorVersionKey))
|
||||
{
|
||||
metadataFile.Emulator = new Emulator
|
||||
{
|
||||
RefName = item.ReadString(Models.Metadata.Header.RefNameKey),
|
||||
Version = item.ReadString(Models.Metadata.Header.EmulatorVersionKey),
|
||||
};
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to an array of <cref="Models.RomCenter.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom[] ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms == null)
|
||||
return [];
|
||||
|
||||
return roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.RomCenter.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertFromInternalModel(Models.Metadata.Rom item, Models.Metadata.Machine parent)
|
||||
{
|
||||
var row = new Rom
|
||||
{
|
||||
RomName = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
RomCRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
RomSize = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
MergeName = item.ReadString(Models.Metadata.Rom.MergeKey),
|
||||
|
||||
ParentName = parent.ReadString(Models.Metadata.Machine.RomOfKey),
|
||||
//ParentDescription = parent.ReadString(Models.Metadata.Machine.ParentDescriptionKey), // This is unmappable
|
||||
GameName = parent.ReadString(Models.Metadata.Machine.NameKey),
|
||||
GameDescription = parent.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.RomCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class RomCenter : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Games?.Rom != null && obj.Games.Rom.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Games.Rom
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertMachineToInternalModel).ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.RomCenter.MetadataFile"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(MetadataFile item)
|
||||
{
|
||||
var header = new Models.Metadata.Header();
|
||||
|
||||
if (item.Credits != null)
|
||||
{
|
||||
header[Models.Metadata.Header.AuthorKey] = item.Credits.Author;
|
||||
header[Models.Metadata.Header.VersionKey] = item.Credits.Version;
|
||||
header[Models.Metadata.Header.EmailKey] = item.Credits.Email;
|
||||
header[Models.Metadata.Header.HomepageKey] = item.Credits.Homepage;
|
||||
header[Models.Metadata.Header.UrlKey] = item.Credits.Url;
|
||||
header[Models.Metadata.Header.DateKey] = item.Credits.Date;
|
||||
header[Models.Metadata.Header.CommentKey] = item.Credits.Comment;
|
||||
}
|
||||
|
||||
if (item.Dat != null)
|
||||
{
|
||||
header[Models.Metadata.Header.DatVersionKey] = item.Dat.Version;
|
||||
header[Models.Metadata.Header.PluginKey] = item.Dat.Plugin;
|
||||
|
||||
if (item.Dat.Split == "yes" || item.Dat.Split == "1")
|
||||
header[Models.Metadata.Header.ForceMergingKey] = "split";
|
||||
else if (item.Dat.Merge == "yes" || item.Dat.Merge == "1")
|
||||
header[Models.Metadata.Header.ForceMergingKey] = "merge";
|
||||
}
|
||||
|
||||
if (item.Emulator != null)
|
||||
{
|
||||
header[Models.Metadata.Header.RefNameKey] = item.Emulator.RefName;
|
||||
header[Models.Metadata.Header.EmulatorVersionKey] = item.Emulator.Version;
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.RomCenter.Game"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Rom item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.RomOfKey] = item.ParentName,
|
||||
//[Models.Metadata.Machine.ParentDescriptionKey] = item.ParentDescription, // This is unmappable
|
||||
[Models.Metadata.Machine.NameKey] = item.GameName,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.GameDescription,
|
||||
[Models.Metadata.Machine.RomKey] = new Models.Metadata.Rom[] { ConvertToInternalModel(item) },
|
||||
};
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.RomCenter.Rom"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Rom item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.RomName,
|
||||
[Models.Metadata.Rom.CRCKey] = item.RomCRC,
|
||||
[Models.Metadata.Rom.SizeKey] = item.RomSize,
|
||||
[Models.Metadata.Rom.MergeKey] = item.MergeName,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,160 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SabreTools.Models.SeparatedValue;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class SeparatedValue : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Row = machines
|
||||
.Where(m => m != null)
|
||||
.SelectMany(m => ConvertMachineFromInternalModel(m, header))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.SeparatedValue.MetadataFile"/>
|
||||
/// </summary>
|
||||
private static MetadataFile ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var metadataFile = new MetadataFile
|
||||
{
|
||||
Header = item.ReadStringArray(Models.Metadata.Header.HeaderKey),
|
||||
};
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to an array of <cref="Models.SeparatedValue.Row"/>
|
||||
/// </summary>
|
||||
private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item, Models.Metadata.Header? header)
|
||||
{
|
||||
var rowItems = new List<Row>();
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.Machine.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
rowItems.AddRange(roms
|
||||
.Where(r => r != null)
|
||||
.Select(rom => ConvertFromInternalModel(rom, item, header)));
|
||||
}
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.Machine.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
rowItems.AddRange(disks
|
||||
.Where(d => d != null)
|
||||
.Select(disk => ConvertFromInternalModel(disk, item, header)));
|
||||
}
|
||||
|
||||
var media = item.Read<Models.Metadata.Media[]>(Models.Metadata.Machine.MediaKey);
|
||||
if (media != null && media.Any())
|
||||
{
|
||||
rowItems.AddRange(media
|
||||
.Where(m => m != null)
|
||||
.Select(medium => ConvertFromInternalModel(medium, item, header)));
|
||||
}
|
||||
|
||||
return rowItems.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.SeparatedValue.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Disk item, Models.Metadata.Machine parent, Models.Metadata.Header? header)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve
|
||||
InternalName = header?.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = header?.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
GameName = parent.ReadString(Models.Metadata.Machine.NameKey),
|
||||
GameDescription = parent.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
Type = "disk",
|
||||
RomName = null,
|
||||
DiskName = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
Size = null,
|
||||
CRC = null,
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
SHA256 = null,
|
||||
SHA384 = null,
|
||||
SHA512 = null,
|
||||
SpamSum = null,
|
||||
Status = item.ReadString(Models.Metadata.Disk.StatusKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Media"/> to <cref="Models.SeparatedValue.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Media item, Models.Metadata.Machine parent, Models.Metadata.Header? header)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve
|
||||
InternalName = header?.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = header?.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
GameName = parent.ReadString(Models.Metadata.Machine.NameKey),
|
||||
GameDescription = parent.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
Type = "media",
|
||||
RomName = null,
|
||||
DiskName = item.ReadString(Models.Metadata.Media.NameKey),
|
||||
Size = null,
|
||||
CRC = null,
|
||||
MD5 = item.ReadString(Models.Metadata.Media.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Media.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Media.SHA256Key),
|
||||
SHA384 = null,
|
||||
SHA512 = null,
|
||||
SpamSum = item.ReadString(Models.Metadata.Media.SpamSumKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.SeparatedValue.Row"/>
|
||||
/// </summary>
|
||||
private static Row ConvertFromInternalModel(Models.Metadata.Rom item, Models.Metadata.Machine parent, Models.Metadata.Header? header)
|
||||
{
|
||||
var row = new Row
|
||||
{
|
||||
FileName = header?.ReadString("FILENAME"), // TODO: Make this an actual key to retrieve
|
||||
InternalName = header?.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = header?.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
GameName = parent.ReadString(Models.Metadata.Machine.NameKey),
|
||||
GameDescription = parent.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
Type = "rom",
|
||||
RomName = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
DiskName = null,
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Rom.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
SHA256 = item.ReadString(Models.Metadata.Rom.SHA256Key),
|
||||
SHA384 = item.ReadString(Models.Metadata.Rom.SHA384Key),
|
||||
SHA512 = item.ReadString(Models.Metadata.Rom.SHA512Key),
|
||||
SpamSum = item.ReadString(Models.Metadata.Rom.SpamSumKey),
|
||||
Status = item.ReadString(Models.Metadata.Rom.StatusKey),
|
||||
};
|
||||
return row;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.SeparatedValue;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class SeparatedValue : IModelSerializer<MetadataFile, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(obj),
|
||||
};
|
||||
|
||||
if (obj?.Row != null && obj.Row.Any())
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row.Select(ConvertMachineToInternalModel).ToArray();
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SeparatedValue.MetadataFile"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(MetadataFile item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.HeaderKey] = item.Header,
|
||||
};
|
||||
|
||||
if (item.Row != null && item.Row.Any())
|
||||
{
|
||||
var first = item.Row[0];
|
||||
//header[Models.Metadata.Header.FileNameKey] = first.FileName; // Not possible to map
|
||||
header[Models.Metadata.Header.NameKey] = first.FileName;
|
||||
header[Models.Metadata.Header.DescriptionKey] = first.Description;
|
||||
}
|
||||
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SeparatedValue.Row"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Row item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.GameName,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.GameDescription,
|
||||
};
|
||||
|
||||
var datItem = ConvertToInternalModel(item);
|
||||
switch (datItem)
|
||||
{
|
||||
case Models.Metadata.Disk disk:
|
||||
machine[Models.Metadata.Machine.DiskKey] = new Models.Metadata.Disk[] { disk };
|
||||
break;
|
||||
|
||||
case Models.Metadata.Media media:
|
||||
machine[Models.Metadata.Machine.MediaKey] = new Models.Metadata.Media[] { media };
|
||||
break;
|
||||
|
||||
case Models.Metadata.Rom rom:
|
||||
machine[Models.Metadata.Machine.RomKey] = new Models.Metadata.Rom[] { rom };
|
||||
break;
|
||||
}
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SeparatedValue.Row"/> to <cref="Models.Metadata.DatItem"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DatItem? ConvertToInternalModel(Row item)
|
||||
{
|
||||
return item.Type switch
|
||||
{
|
||||
"disk" => new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.Disk.NameKey] = item.DiskName,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Disk.StatusKey] = item.Status,
|
||||
},
|
||||
"media" => new Models.Metadata.Media
|
||||
{
|
||||
[Models.Metadata.Media.NameKey] = item.DiskName,
|
||||
[Models.Metadata.Media.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Media.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Media.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Media.SpamSumKey] = item.SpamSum,
|
||||
},
|
||||
"rom" => new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.RomName,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.SHA256Key] = item.SHA256,
|
||||
[Models.Metadata.Rom.SHA384Key] = item.SHA384,
|
||||
[Models.Metadata.Rom.SHA512Key] = item.SHA512,
|
||||
[Models.Metadata.Rom.SpamSumKey] = item.SpamSum,
|
||||
[Models.Metadata.Rom.StatusKey] = item.Status,
|
||||
},
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,300 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.SoftwareList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class SoftwareList : IModelSerializer<Models.SoftwareList.SoftwareList, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.SoftwareList.SoftwareList? Deserialize(Models.Metadata.MetadataFile? obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
||||
var header = obj.Read<Models.Metadata.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new Models.SoftwareList.SoftwareList();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
metadataFile.Software = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.SoftwareList.SoftwareList"/>
|
||||
/// </summary>
|
||||
private static Models.SoftwareList.SoftwareList ConvertHeaderFromInternalModel(Models.Metadata.Header item)
|
||||
{
|
||||
var softwareList = new Models.SoftwareList.SoftwareList
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Header.NameKey),
|
||||
Description = item.ReadString(Models.Metadata.Header.DescriptionKey),
|
||||
Notes = item.ReadString(Models.Metadata.Header.NotesKey),
|
||||
};
|
||||
return softwareList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.SoftwareList.Software"/>
|
||||
/// </summary>
|
||||
private static Software ConvertMachineFromInternalModel(Models.Metadata.Machine item)
|
||||
{
|
||||
var software = new Software
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Machine.NameKey),
|
||||
CloneOf = item.ReadString(Models.Metadata.Machine.CloneOfKey),
|
||||
Supported = item.ReadString(Models.Metadata.Machine.SupportedKey),
|
||||
Description = item.ReadString(Models.Metadata.Machine.DescriptionKey),
|
||||
Year = item.ReadString(Models.Metadata.Machine.YearKey),
|
||||
Publisher = item.ReadString(Models.Metadata.Machine.PublisherKey),
|
||||
Notes = item.ReadString(Models.Metadata.Machine.NotesKey),
|
||||
};
|
||||
|
||||
var infos = item.Read<Models.Metadata.Info[]>(Models.Metadata.Machine.InfoKey);
|
||||
if (infos != null && infos.Any())
|
||||
{
|
||||
software.Info = infos
|
||||
.Where(i => i != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var sharedFeats = item.Read<Models.Metadata.SharedFeat[]>(Models.Metadata.Machine.SharedFeatKey);
|
||||
if (sharedFeats != null && sharedFeats.Any())
|
||||
{
|
||||
software.SharedFeat = sharedFeats
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var parts = item.Read<Models.Metadata.Part[]>(Models.Metadata.Machine.PartKey);
|
||||
if (parts != null && parts.Any())
|
||||
{
|
||||
software.Part = parts
|
||||
.Where(p => p != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return software;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DataArea"/> to <cref="Models.SoftwareList.DataArea"/>
|
||||
/// </summary>
|
||||
private static DataArea ConvertFromInternalModel(Models.Metadata.DataArea item)
|
||||
{
|
||||
var dataArea = new DataArea
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DataArea.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.DataArea.SizeKey),
|
||||
Width = item.ReadString(Models.Metadata.DataArea.WidthKey),
|
||||
Endianness = item.ReadString(Models.Metadata.DataArea.EndiannessKey),
|
||||
};
|
||||
|
||||
var roms = item.Read<Models.Metadata.Rom[]>(Models.Metadata.DataArea.RomKey);
|
||||
if (roms != null && roms.Any())
|
||||
{
|
||||
dataArea.Rom = roms
|
||||
.Where(r => r != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return dataArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipSwitch"/> to <cref="Models.SoftwareList.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static DipSwitch ConvertFromInternalModel(Models.Metadata.DipSwitch item)
|
||||
{
|
||||
var dipSwitch = new DipSwitch
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipSwitch.NameKey),
|
||||
Tag = item.ReadString(Models.Metadata.DipSwitch.TagKey),
|
||||
Mask = item.ReadString(Models.Metadata.DipSwitch.MaskKey),
|
||||
};
|
||||
|
||||
var dipValues = item.Read<Models.Metadata.DipValue[]>(Models.Metadata.DipSwitch.DipValueKey);
|
||||
if (dipValues != null && dipValues.Any())
|
||||
{
|
||||
dipSwitch.DipValue = dipValues
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DipValue"/> to <cref="Models.SoftwareList.DipValue"/>
|
||||
/// </summary>
|
||||
private static DipValue ConvertFromInternalModel(Models.Metadata.DipValue item)
|
||||
{
|
||||
var dipValue = new DipValue
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DipValue.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.DipValue.ValueKey),
|
||||
Default = item.ReadString(Models.Metadata.DipValue.DefaultKey),
|
||||
};
|
||||
return dipValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Disk"/> to <cref="Models.SoftwareList.Disk"/>
|
||||
/// </summary>
|
||||
private static Disk ConvertFromInternalModel(Models.Metadata.Disk item)
|
||||
{
|
||||
var disk = new Disk
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Disk.NameKey),
|
||||
MD5 = item.ReadString(Models.Metadata.Disk.MD5Key),
|
||||
SHA1 = item.ReadString(Models.Metadata.Disk.SHA1Key),
|
||||
Status = item.ReadString(Models.Metadata.Disk.StatusKey),
|
||||
Writeable = item.ReadString(Models.Metadata.Disk.WritableKey),
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.DiskArea"/> to <cref="Models.SoftwareList.DiskArea"/>
|
||||
/// </summary>
|
||||
private static DiskArea ConvertFromInternalModel(Models.Metadata.DiskArea item)
|
||||
{
|
||||
var diskArea = new DiskArea
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.DiskArea.NameKey),
|
||||
};
|
||||
|
||||
var disks = item.Read<Models.Metadata.Disk[]>(Models.Metadata.DiskArea.DiskKey);
|
||||
if (disks != null && disks.Any())
|
||||
{
|
||||
diskArea.Disk = disks
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return diskArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Feature"/> to <cref="Models.SoftwareList.Feature"/>
|
||||
/// </summary>
|
||||
private static Feature ConvertFromInternalModel(Models.Metadata.Feature item)
|
||||
{
|
||||
var feature = new Feature
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Feature.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.Feature.ValueKey),
|
||||
};
|
||||
return feature;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Info"/> to <cref="Models.SoftwareList.Info"/>
|
||||
/// </summary>
|
||||
private static Info ConvertFromInternalModel(Models.Metadata.Info item)
|
||||
{
|
||||
var info = new Info
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Info.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.Info.ValueKey),
|
||||
};
|
||||
return info;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Part"/> to <cref="Models.SoftwareList.Part"/>
|
||||
/// </summary>
|
||||
private static Part ConvertFromInternalModel(Models.Metadata.Part item)
|
||||
{
|
||||
var part = new Part
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Part.NameKey),
|
||||
Interface = item.ReadString(Models.Metadata.Part.InterfaceKey),
|
||||
};
|
||||
|
||||
var features = item.Read<Models.Metadata.Feature[]>(Models.Metadata.Part.FeatureKey);
|
||||
if (features != null && features.Any())
|
||||
{
|
||||
part.Feature = features
|
||||
.Where(f => f != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var dataAreas = item.Read<Models.Metadata.DataArea[]>(Models.Metadata.Part.DataAreaKey);
|
||||
if (dataAreas != null && dataAreas.Any())
|
||||
{
|
||||
part.DataArea = dataAreas
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var diskAreas = item.Read<Models.Metadata.DiskArea[]>(Models.Metadata.Part.DiskAreaKey);
|
||||
if (diskAreas != null && diskAreas.Any())
|
||||
{
|
||||
part.DiskArea = diskAreas
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
var dipSwitches = item.Read<Models.Metadata.DipSwitch[]>(Models.Metadata.Part.DipSwitchKey);
|
||||
if (dipSwitches != null && dipSwitches.Any())
|
||||
{
|
||||
part.DipSwitch = dipSwitches
|
||||
.Where(d => d != null)
|
||||
.Select(ConvertFromInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.SoftwareList.Rom"/>
|
||||
/// </summary>
|
||||
private static Rom ConvertFromInternalModel(Models.Metadata.Rom item)
|
||||
{
|
||||
var rom = new Rom
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.Rom.NameKey),
|
||||
Size = item.ReadString(Models.Metadata.Rom.SizeKey),
|
||||
Length = item.ReadString(Models.Metadata.Rom.LengthKey),
|
||||
CRC = item.ReadString(Models.Metadata.Rom.CRCKey),
|
||||
SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key),
|
||||
Offset = item.ReadString(Models.Metadata.Rom.OffsetKey),
|
||||
Value = item.ReadString(Models.Metadata.Rom.ValueKey),
|
||||
Status = item.ReadString(Models.Metadata.Rom.StatusKey),
|
||||
LoadFlag = item.ReadString(Models.Metadata.Rom.LoadFlagKey),
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.SharedFeat"/> to <cref="Models.SoftwareList.SharedFeat"/>
|
||||
/// </summary>
|
||||
private static SharedFeat ConvertFromInternalModel(Models.Metadata.SharedFeat item)
|
||||
{
|
||||
var sharedFeat = new SharedFeat
|
||||
{
|
||||
Name = item.ReadString(Models.Metadata.SharedFeat.NameKey),
|
||||
Value = item.ReadString(Models.Metadata.SharedFeat.ValueKey),
|
||||
};
|
||||
return sharedFeat;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,241 +0,0 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.SoftwareList;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class SoftwareList : IModelSerializer<Models.SoftwareList.SoftwareList, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Metadata.MetadataFile? Serialize(Models.SoftwareList.SoftwareList? item)
|
||||
{
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
var metadataFile = new Models.Metadata.MetadataFile
|
||||
{
|
||||
[Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item),
|
||||
};
|
||||
|
||||
if (item?.Software != null && item.Software.Any())
|
||||
{
|
||||
metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Software
|
||||
.Where(s => s != null)
|
||||
.Select(ConvertMachineToInternalModel)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return metadataFile;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.SoftwareList"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.SoftwareList.SoftwareList item)
|
||||
{
|
||||
var header = new Models.Metadata.Header
|
||||
{
|
||||
[Models.Metadata.Header.NameKey] = item.Name,
|
||||
[Models.Metadata.Header.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Header.NotesKey] = item.Notes,
|
||||
};
|
||||
return header;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Software"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Machine ConvertMachineToInternalModel(Software item)
|
||||
{
|
||||
var machine = new Models.Metadata.Machine
|
||||
{
|
||||
[Models.Metadata.Machine.NameKey] = item.Name,
|
||||
[Models.Metadata.Machine.CloneOfKey] = item.CloneOf,
|
||||
[Models.Metadata.Machine.SupportedKey] = item.Supported,
|
||||
[Models.Metadata.Machine.DescriptionKey] = item.Description,
|
||||
[Models.Metadata.Machine.YearKey] = item.Year,
|
||||
[Models.Metadata.Machine.PublisherKey] = item.Publisher,
|
||||
[Models.Metadata.Machine.NotesKey] = item.Notes,
|
||||
};
|
||||
|
||||
if (item.Info != null && item.Info.Any())
|
||||
machine[Models.Metadata.Machine.InfoKey] = item.Info.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.SharedFeat != null && item.SharedFeat.Any())
|
||||
machine[Models.Metadata.Machine.SharedFeatKey] = item.SharedFeat.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.Part != null && item.Part.Any())
|
||||
machine[Models.Metadata.Machine.PartKey] = item.Part.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return machine;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.DataArea"/> to <cref="Models.Metadata.DataArea"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DataArea ConvertToInternalModel(DataArea item)
|
||||
{
|
||||
var dataArea = new Models.Metadata.DataArea
|
||||
{
|
||||
[Models.Metadata.DataArea.NameKey] = item.Name,
|
||||
[Models.Metadata.DataArea.SizeKey] = item.Size,
|
||||
[Models.Metadata.DataArea.WidthKey] = item.Width,
|
||||
[Models.Metadata.DataArea.EndiannessKey] = item.Endianness,
|
||||
};
|
||||
|
||||
if (item.Rom != null && item.Rom.Any())
|
||||
dataArea[Models.Metadata.DataArea.RomKey] = item.Rom.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return dataArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.DipSwitch"/> to <cref="Models.Metadata.DipSwitch"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipSwitch ConvertToInternalModel(DipSwitch item)
|
||||
{
|
||||
var dipSwitch = new Models.Metadata.DipSwitch
|
||||
{
|
||||
[Models.Metadata.DipSwitch.NameKey] = item.Name,
|
||||
[Models.Metadata.DipSwitch.TagKey] = item.Tag,
|
||||
[Models.Metadata.DipSwitch.MaskKey] = item.Mask,
|
||||
};
|
||||
|
||||
if (item.DipValue != null && item.DipValue.Any())
|
||||
dipSwitch[Models.Metadata.DipSwitch.DipValueKey] = item.DipValue.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return dipSwitch;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.DipValue"/> to <cref="Models.Metadata.DipValue"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DipValue ConvertToInternalModel(DipValue item)
|
||||
{
|
||||
var dipValue = new Models.Metadata.DipValue
|
||||
{
|
||||
[Models.Metadata.DipValue.NameKey] = item.Name,
|
||||
[Models.Metadata.DipValue.ValueKey] = item.Value,
|
||||
[Models.Metadata.DipValue.DefaultKey] = item.Default,
|
||||
};
|
||||
return dipValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Disk"/> to <cref="Models.Metadata.Disk"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Disk ConvertToInternalModel(Disk item)
|
||||
{
|
||||
var disk = new Models.Metadata.Disk
|
||||
{
|
||||
[Models.Metadata.Disk.NameKey] = item.Name,
|
||||
[Models.Metadata.Disk.MD5Key] = item.MD5,
|
||||
[Models.Metadata.Disk.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Disk.StatusKey] = item.Status,
|
||||
[Models.Metadata.Disk.WritableKey] = item.Writeable,
|
||||
};
|
||||
return disk;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.DiskArea"/> to <cref="Models.Metadata.DiskArea"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.DiskArea ConvertToInternalModel(DiskArea item)
|
||||
{
|
||||
var diskArea = new Models.Metadata.DiskArea
|
||||
{
|
||||
[Models.Metadata.DiskArea.NameKey] = item.Name,
|
||||
};
|
||||
|
||||
if (item.Disk != null && item.Disk.Any())
|
||||
diskArea[Models.Metadata.DiskArea.DiskKey] = item.Disk.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return diskArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Feature"/> to <cref="Models.Metadata.Feature"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Feature ConvertToInternalModel(Feature item)
|
||||
{
|
||||
var feature = new Models.Metadata.Feature
|
||||
{
|
||||
[Models.Metadata.Feature.NameKey] = item.Name,
|
||||
[Models.Metadata.Feature.ValueKey] = item.Value,
|
||||
};
|
||||
return feature;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Info"/> to <cref="Models.Metadata.Info"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Info ConvertToInternalModel(Info item)
|
||||
{
|
||||
var info = new Models.Metadata.Info
|
||||
{
|
||||
[Models.Metadata.Info.NameKey] = item.Name,
|
||||
[Models.Metadata.Info.ValueKey] = item.Value,
|
||||
};
|
||||
return info;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Part"/> to <cref="Models.Metadata.Part"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Part ConvertToInternalModel(Part item)
|
||||
{
|
||||
var part = new Models.Metadata.Part
|
||||
{
|
||||
[Models.Metadata.Part.NameKey] = item.Name,
|
||||
[Models.Metadata.Part.InterfaceKey] = item.Interface,
|
||||
};
|
||||
|
||||
if (item.Feature != null && item.Feature.Any())
|
||||
part[Models.Metadata.Part.FeatureKey] = item.Feature.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.DataArea != null && item.DataArea.Any())
|
||||
part[Models.Metadata.Part.DataAreaKey] = item.DataArea.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.DiskArea != null && item.DiskArea.Any())
|
||||
part[Models.Metadata.Part.DiskAreaKey] = item.DiskArea.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
if (item.DipSwitch != null && item.DipSwitch.Any())
|
||||
part[Models.Metadata.Part.DipSwitchKey] = item.DipSwitch.Select(ConvertToInternalModel).ToArray();
|
||||
|
||||
return part;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.Rom"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.Rom ConvertToInternalModel(Rom item)
|
||||
{
|
||||
var rom = new Models.Metadata.Rom
|
||||
{
|
||||
[Models.Metadata.Rom.NameKey] = item.Name,
|
||||
[Models.Metadata.Rom.SizeKey] = item.Size,
|
||||
[Models.Metadata.Rom.LengthKey] = item.Length,
|
||||
[Models.Metadata.Rom.CRCKey] = item.CRC,
|
||||
[Models.Metadata.Rom.SHA1Key] = item.SHA1,
|
||||
[Models.Metadata.Rom.OffsetKey] = item.Offset,
|
||||
[Models.Metadata.Rom.ValueKey] = item.Value,
|
||||
[Models.Metadata.Rom.StatusKey] = item.Status,
|
||||
[Models.Metadata.Rom.LoadFlagKey] = item.LoadFlag,
|
||||
};
|
||||
return rom;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.SoftwareList.SharedFeat"/> to <cref="Models.Metadata.SharedFeat"/>
|
||||
/// </summary>
|
||||
private static Models.Metadata.SharedFeat ConvertToInternalModel(SharedFeat item)
|
||||
{
|
||||
var sharedFeat = new Models.Metadata.SharedFeat
|
||||
{
|
||||
[Models.Metadata.SharedFeat.NameKey] = item.Name,
|
||||
[Models.Metadata.SharedFeat.ValueKey] = item.Value,
|
||||
};
|
||||
return sharedFeat;
|
||||
}
|
||||
}
|
||||
}
|
||||
13
Enums.cs
13
Enums.cs
@@ -1,13 +0,0 @@
|
||||
namespace SabreTools.Serialization
|
||||
{
|
||||
public enum Hash
|
||||
{
|
||||
CRC,
|
||||
MD5,
|
||||
SHA1,
|
||||
SHA256,
|
||||
SHA384,
|
||||
SHA512,
|
||||
SpamSum,
|
||||
}
|
||||
}
|
||||
56
ExtractionTool/ExtractionTool.csproj
Normal file
56
ExtractionTool/ExtractionTool.csproj
Normal file
@@ -0,0 +1,56 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>
|
||||
<OutputType>Exe</OutputType>
|
||||
<CheckEolTargetFramework>false</CheckEolTargetFramework>
|
||||
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
|
||||
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<Version>2.2.1</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Support All Frameworks -->
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net2`)) OR $(TargetFramework.StartsWith(`net3`)) OR $(TargetFramework.StartsWith(`net4`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`netcoreapp`)) OR $(TargetFramework.StartsWith(`net5`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(TargetFramework.StartsWith(`net6`)) OR $(TargetFramework.StartsWith(`net7`)) OR $(TargetFramework.StartsWith(`net8`)) OR $(TargetFramework.StartsWith(`net9`)) OR $(TargetFramework.StartsWith(`net10`))">
|
||||
<RuntimeIdentifiers>win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="$(RuntimeIdentifier.StartsWith(`osx-arm`))">
|
||||
<TargetFrameworks>net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- These are needed for dealing with native Windows DLLs -->
|
||||
<ItemGroup Condition="'$(RuntimeIdentifier)'=='win-x86'">
|
||||
<ContentWithTargetPath Include="..\SabreTools.Serialization\runtimes\win-x86\native\StormLib.dll">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Always</CopyToPublishDirectory>
|
||||
<TargetPath>StormLib.dll</TargetPath>
|
||||
</ContentWithTargetPath>
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition="'$(RuntimeIdentifier)'=='win-x64'">
|
||||
<ContentWithTargetPath Include="..\SabreTools.Serialization\runtimes\win-x64\native\StormLib.dll">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Always</CopyToPublishDirectory>
|
||||
<TargetPath>StormLib.dll</TargetPath>
|
||||
</ContentWithTargetPath>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SabreTools.Serialization\SabreTools.Serialization.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SabreTools.CommandLine" Version="[1.4.0]" />
|
||||
<PackageReference Include="SabreTools.IO" Version="[1.9.0]" />
|
||||
<PackageReference Include="System.Text.Encoding.CodePages" Version="10.0.0" Condition="!$(TargetFramework.StartsWith(`net2`)) AND !$(TargetFramework.StartsWith(`net3`)) AND !$(TargetFramework.StartsWith(`net40`)) AND !$(TargetFramework.StartsWith(`net452`))" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
340
ExtractionTool/Features/MainFeature.cs
Normal file
340
ExtractionTool/Features/MainFeature.cs
Normal file
@@ -0,0 +1,340 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using SabreTools.CommandLine;
|
||||
using SabreTools.CommandLine.Inputs;
|
||||
using SabreTools.IO.Extensions;
|
||||
using SabreTools.Serialization;
|
||||
using SabreTools.Serialization.Wrappers;
|
||||
|
||||
namespace ExtractionTool.Features
|
||||
{
|
||||
internal sealed class MainFeature : Feature
|
||||
{
|
||||
#region Feature Definition
|
||||
|
||||
public const string DisplayName = "main";
|
||||
|
||||
/// <remarks>Flags are unused</remarks>
|
||||
private static readonly string[] _flags = [];
|
||||
|
||||
/// <remarks>Description is unused</remarks>
|
||||
private const string _description = "";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Inputs
|
||||
|
||||
private const string _debugName = "debug";
|
||||
internal readonly FlagInput DebugInput = new(_debugName, ["-d", "--debug"], "Enable debug mode");
|
||||
|
||||
private const string _outputPathName = "output-path";
|
||||
internal readonly StringInput OutputPathInput = new(_outputPathName, ["-o", "--outdir"], "Set output path for extraction (required)");
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Enable debug output for relevant operations
|
||||
/// </summary>
|
||||
public bool Debug { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Output path for archive extraction
|
||||
/// </summary>
|
||||
public string OutputPath { get; private set; } = string.Empty;
|
||||
|
||||
#endregion
|
||||
|
||||
public MainFeature()
|
||||
: base(DisplayName, _flags, _description)
|
||||
{
|
||||
RequiresInputs = true;
|
||||
|
||||
Add(DebugInput);
|
||||
Add(OutputPathInput);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool Execute()
|
||||
{
|
||||
// Get the options from the arguments
|
||||
Debug = GetBoolean(_debugName);
|
||||
OutputPath = GetString(_outputPathName) ?? string.Empty;
|
||||
|
||||
// Validate the output path
|
||||
if (!ValidateExtractionPath())
|
||||
return false;
|
||||
|
||||
// Loop through the input paths
|
||||
for (int i = 0; i < Inputs.Count; i++)
|
||||
{
|
||||
string arg = Inputs[i];
|
||||
ExtractPath(arg);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override bool VerifyInputs() => Inputs.Count > 0;
|
||||
|
||||
/// <summary>
|
||||
/// Wrapper to extract data for a single path
|
||||
/// </summary>
|
||||
/// <param name="path">File or directory path</param>
|
||||
private void ExtractPath(string path)
|
||||
{
|
||||
// Normalize by getting the full path
|
||||
path = Path.GetFullPath(path);
|
||||
Console.WriteLine($"Checking possible path: {path}");
|
||||
|
||||
// Check if the file or directory exists
|
||||
if (File.Exists(path))
|
||||
{
|
||||
ExtractFile(path);
|
||||
}
|
||||
else if (Directory.Exists(path))
|
||||
{
|
||||
foreach (string file in path.SafeEnumerateFiles("*", SearchOption.AllDirectories))
|
||||
{
|
||||
ExtractFile(file);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine($"{path} does not exist, skipping...");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Print information for a single file, if possible
|
||||
/// </summary>
|
||||
/// <param name="path">File path</param>
|
||||
private void ExtractFile(string file)
|
||||
{
|
||||
Console.WriteLine($"Attempting to extract all files from {file}");
|
||||
using Stream stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||||
|
||||
// Get the extension for certain checks
|
||||
string extension = Path.GetExtension(file).ToLower().TrimStart('.');
|
||||
|
||||
// Get the first 16 bytes for matching
|
||||
byte[] magic = new byte[16];
|
||||
try
|
||||
{
|
||||
int read = stream.Read(magic, 0, 16);
|
||||
stream.SeekIfPossible(0, SeekOrigin.Begin);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (Debug) Console.Error.WriteLine(ex);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the file type
|
||||
WrapperType ft = WrapperFactory.GetFileType(magic, extension);
|
||||
var wrapper = WrapperFactory.CreateWrapper(ft, stream);
|
||||
|
||||
// Create the output directory
|
||||
Directory.CreateDirectory(OutputPath);
|
||||
|
||||
// Print the preamble
|
||||
Console.WriteLine($"Attempting to extract from '{wrapper?.Description() ?? "UNKNOWN"}'");
|
||||
Console.WriteLine();
|
||||
|
||||
switch (wrapper)
|
||||
{
|
||||
// 7-zip
|
||||
case SevenZip sz:
|
||||
sz.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// BFPK archive
|
||||
case BFPK bfpk:
|
||||
bfpk.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// BSP
|
||||
case BSP bsp:
|
||||
bsp.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// bzip2
|
||||
case BZip2 bzip2:
|
||||
bzip2.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// CD-ROM bin file
|
||||
case CDROM cdrom:
|
||||
cdrom.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// CFB
|
||||
case CFB cfb:
|
||||
cfb.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// GCF
|
||||
case GCF gcf:
|
||||
gcf.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// gzip
|
||||
case GZip gzip:
|
||||
gzip.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// InstallShield Archive V3 (Z)
|
||||
case InstallShieldArchiveV3 isv3:
|
||||
isv3.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// IS-CAB archive
|
||||
case InstallShieldCabinet iscab:
|
||||
iscab.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// ISO 9660 volume
|
||||
case ISO9660 iso9660:
|
||||
iso9660.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// LZ-compressed file, KWAJ variant
|
||||
case LZKWAJ kwaj:
|
||||
kwaj.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// LZ-compressed file, QBasic variant
|
||||
case LZQBasic qbasic:
|
||||
qbasic.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// LZ-compressed file, SZDD variant
|
||||
case LZSZDD szdd:
|
||||
szdd.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// Microsoft Cabinet archive
|
||||
case MicrosoftCabinet mscab:
|
||||
mscab.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// MoPaQ (MPQ) archive
|
||||
case MoPaQ mpq:
|
||||
mpq.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// New Executable
|
||||
case NewExecutable nex:
|
||||
nex.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// PAK
|
||||
case PAK pak:
|
||||
pak.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// PFF
|
||||
case PFF pff:
|
||||
pff.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// PKZIP
|
||||
case PKZIP pkzip:
|
||||
pkzip.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// Portable Executable
|
||||
case PortableExecutable pex:
|
||||
pex.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// Quantum
|
||||
case Quantum quantum:
|
||||
quantum.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// RAR
|
||||
case RAR rar:
|
||||
rar.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// SGA
|
||||
case SGA sga:
|
||||
sga.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// Tape Archive
|
||||
case TapeArchive tar:
|
||||
tar.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// VBSP
|
||||
case VBSP vbsp:
|
||||
vbsp.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// VPK
|
||||
case VPK vpk:
|
||||
vpk.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// WAD3
|
||||
case WAD3 wad:
|
||||
wad.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// xz
|
||||
case XZ xz:
|
||||
xz.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// XZP
|
||||
case XZP xzp:
|
||||
xzp.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// ZSTD
|
||||
case ZSTD zstd:
|
||||
zstd.Extract(OutputPath, Debug);
|
||||
break;
|
||||
|
||||
// Everything else
|
||||
default:
|
||||
Console.WriteLine("Not a supported extractable file format, skipping...");
|
||||
Console.WriteLine();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validate the extraction path
|
||||
/// </summary>
|
||||
private bool ValidateExtractionPath()
|
||||
{
|
||||
// Null or empty output path
|
||||
if (string.IsNullOrEmpty(OutputPath))
|
||||
{
|
||||
Console.WriteLine("Output directory required for extraction!");
|
||||
Console.WriteLine();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Malformed output path or invalid location
|
||||
try
|
||||
{
|
||||
OutputPath = Path.GetFullPath(OutputPath);
|
||||
Directory.CreateDirectory(OutputPath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Console.WriteLine("Output directory could not be created!");
|
||||
Console.WriteLine();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
79
ExtractionTool/Program.cs
Normal file
79
ExtractionTool/Program.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using ExtractionTool.Features;
|
||||
using SabreTools.CommandLine;
|
||||
using SabreTools.CommandLine.Features;
|
||||
|
||||
namespace ExtractionTool
|
||||
{
|
||||
public static class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
#if NET462_OR_GREATER || NETCOREAPP
|
||||
// Register the codepages
|
||||
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
||||
#endif
|
||||
|
||||
// Create the command set
|
||||
var mainFeature = new MainFeature();
|
||||
var commandSet = CreateCommands(mainFeature);
|
||||
|
||||
// If we have no args, show the help and quit
|
||||
if (args is null || args.Length == 0)
|
||||
{
|
||||
commandSet.OutputAllHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
// Cache the first argument and starting index
|
||||
string featureName = args[0];
|
||||
|
||||
// Try processing the standalone arguments
|
||||
var topLevel = commandSet.GetTopLevel(featureName);
|
||||
switch (topLevel)
|
||||
{
|
||||
// Standalone Options
|
||||
case Help help: help.ProcessArgs(args, 0, commandSet); return;
|
||||
|
||||
// Default Behavior
|
||||
default:
|
||||
if (!mainFeature.ProcessArgs(args, 0))
|
||||
{
|
||||
commandSet.OutputAllHelp();
|
||||
return;
|
||||
}
|
||||
else if (!mainFeature.VerifyInputs())
|
||||
{
|
||||
Console.Error.WriteLine("At least one input is required");
|
||||
commandSet.OutputAllHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
mainFeature.Execute();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create the command set for the program
|
||||
/// </summary>
|
||||
private static CommandSet CreateCommands(MainFeature mainFeature)
|
||||
{
|
||||
List<string> header = [
|
||||
"Extraction Tool",
|
||||
string.Empty,
|
||||
"ExtractionTool <options> file|directory ...",
|
||||
string.Empty,
|
||||
];
|
||||
|
||||
var commandSet = new CommandSet(header);
|
||||
|
||||
commandSet.Add(new Help(["-?", "-h", "--help"]));
|
||||
commandSet.Add(mainFeature.DebugInput);
|
||||
commandSet.Add(mainFeature.OutputPathInput);
|
||||
|
||||
return commandSet;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class ArchiveDotOrg : XmlFile<Models.ArchiveDotOrg.Files>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class ArchiveDotOrg : XmlFile<Models.ArchiveDotOrg.Files>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class AttractMode : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.AttractMode().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.AttractMode;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class AttractMode : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(MetadataFile? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.AttractMode().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class ClrMamePro : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path) => Deserialize(path, true);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path, bool quotes)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.ClrMamePro().Deserialize(stream, quotes);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Models.ClrMamePro;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class ClrMamePro : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(MetadataFile? obj, string? path) => Serialize(obj, path, true);
|
||||
|
||||
/// <inheritdoc cref="Serialize(MetadataFile, string)"/>
|
||||
public bool Serialize(MetadataFile? obj, string? path, bool quotes)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.ClrMamePro().Serialize(obj, quotes);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using System.IO;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class CueSheet : IFileSerializer<Models.CueSheets.CueSheet>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(Models.CueSheets.CueSheet? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.CueSheet().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class DosCenter : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.DosCenter().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using SabreTools.Models.DosCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class DosCenter : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(MetadataFile? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.DosCenter().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class EverdriveSMDB : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.EverdriveSMDB().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using SabreTools.Models.EverdriveSMDB;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class EverdriveSMDB : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(MetadataFile? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.EverdriveSMDB().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Hashfile : IFileSerializer<Models.Hashfile.Hashfile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.Hashfile.Hashfile? Deserialize(string? path) => Deserialize(path, Hash.CRC);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Models.Hashfile.Hashfile? Deserialize(string? path, Hash hash)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.Hashfile().Deserialize(stream, hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Hashfile : IFileSerializer<Models.Hashfile.Hashfile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(Models.Hashfile.Hashfile? obj, string? path) => Serialize(obj, path, Hash.CRC);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(Models.Hashfile.Hashfile? obj, string? path, Hash hash)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.Hashfile().Serialize(obj, hash);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class IRD : IFileSerializer<Models.IRD.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Models.IRD.File? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.IRD().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class IRD : IFileSerializer<Models.IRD.File>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(Models.IRD.File? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.IRD().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Listrom : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.Listrom().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using SabreTools.Models.Listrom;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Listrom : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(MetadataFile? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.Listrom().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Listxml : XmlFile<Models.Listxml.Mame>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Listxml : XmlFile<Models.Listxml.Mame>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Logiqx : XmlFile<Models.Logiqx.Datafile>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using SabreTools.Models.Logiqx;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class Logiqx : XmlFile<Datafile>
|
||||
{
|
||||
/// <inheritdoc cref="Serialize(Datafile, string, string?, string?, string?, string?)" />
|
||||
public bool SerializeToFileWithDocType(Datafile? obj, string path)
|
||||
=> Serialize(obj, path, Serialization.Logiqx.DocTypeName, Serialization.Logiqx.DocTypePubId, Serialization.Logiqx.DocTypeSysId, Serialization.Logiqx.DocTypeSysId);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class M1 : XmlFile<Models.Listxml.M1>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class M1 : XmlFile<Models.Listxml.M1>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OpenMSX : XmlFile<Models.OpenMSX.SoftwareDb>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using SabreTools.Models.OpenMSX;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OpenMSX : XmlFile<SoftwareDb>
|
||||
{
|
||||
/// <inheritdoc cref="Serialize(SoftwareDb, string, string?, string?, string?, string?)" />
|
||||
public bool SerializeToFileWithDocType(SoftwareDb? obj, string path)
|
||||
=> Serialize(obj, path, Serialization.OpenMSX.DocTypeName, Serialization.OpenMSX.DocTypePubId, Serialization.OpenMSX.DocTypeSysId, Serialization.OpenMSX.DocTypeSysId);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.PIC;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class PIC : IFileSerializer<DiscInformation>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public DiscInformation? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.PIC().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using SabreTools.Models.PIC;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class PIC : IFileSerializer<DiscInformation>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public bool Serialize(DiscInformation? obj, string? path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return false;
|
||||
|
||||
using var stream = new Streams.PIC().Serialize(obj);
|
||||
if (stream == null)
|
||||
return false;
|
||||
|
||||
using var fs = System.IO.File.OpenWrite(path);
|
||||
stream.CopyTo(fs);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using SabreTools.Models.RomCenter;
|
||||
using SabreTools.Serialization.Interfaces;
|
||||
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class RomCenter : IFileSerializer<MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public MetadataFile? Deserialize(string? path)
|
||||
{
|
||||
using (var stream = PathProcessor.OpenStream(path))
|
||||
{
|
||||
return new Streams.RomCenter().Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user