• R/O
  • SSH
  • HTTPS

customtool: 提交


Commit MetaInfo

修订版3 (tree)
时间2014-03-14 05:15:21
作者hogepiyo

Log Message

TSOSorter登録

更改概述

差异

--- TSOSorter/Source/TDCG/LZSS.cs (nonexistent)
+++ TSOSorter/Source/TDCG/LZSS.cs (revision 3)
@@ -0,0 +1,388 @@
1+// based on TDCGMan
2+// Modified by N765/Konoa
3+
4+using System;
5+using System.Collections.Generic;
6+using System.IO;
7+using System.Text;
8+using System.Diagnostics;
9+
10+namespace TDCGExplorer
11+{
12+ public class LZSSWindow
13+ {
14+ public const int WINDOW_BITS = 12;
15+ public const int LENGTH_BITS = 4;
16+ public const int WINDOW_MAX = 1 << WINDOW_BITS;
17+ public const int WINDOW_MASK = WINDOW_MAX - 1;
18+ public const int LENGTH_MASK = (1 << LENGTH_BITS) - 1;
19+ public const int LENGTH_MIN = 3;
20+ public const int LENGTH_MAX = LENGTH_MIN + LENGTH_MASK;
21+
22+ protected byte[] window;
23+ protected int current;
24+ protected int fill;
25+
26+ public LZSSWindow()
27+ {
28+ window = new byte[WINDOW_MAX];
29+ current = 0;
30+ fill = 0;
31+ }
32+
33+ public byte CurrentByte
34+ {
35+ get { return window[current]; }
36+ set { window[current] = value; }
37+ }
38+
39+ public byte this[int index]
40+ {
41+ get { return window[(current + index) & WINDOW_MASK]; }
42+ set { window[(current + index) & WINDOW_MASK] = value; }
43+ }
44+
45+ public byte GetAbs(int index)
46+ {
47+ return window[index & WINDOW_MASK];
48+ }
49+
50+ public void Advance()
51+ {
52+ Advance(1);
53+ }
54+
55+ public void Advance(int n)
56+ {
57+ current = (current + n) & WINDOW_MASK;
58+ fill = fill + n;
59+ }
60+
61+ public int CalcHash(int offset)
62+ {
63+ return CalcHash(this[offset], this[offset + 1], this[offset + 2]);
64+ }
65+
66+ // 24ビットを12ビットに圧縮
67+ public static int CalcHash(int b1, int b2, int b3)
68+ {
69+ b2 <<= 4;
70+ b3 = ((b3 & 15) << 8) | (b3 >> 4);
71+ int hash = b1 ^ b2 ^ b3;
72+ return hash;
73+ }
74+
75+ public void Push(byte b)
76+ {
77+ CurrentByte = b;
78+ Advance();
79+ }
80+
81+ public void Put(int offset, byte b)
82+ {
83+ this[offset] = b;
84+ }
85+ }
86+ public class LZSSDeflateWindow : LZSSWindow
87+ {
88+ public const int HASH_MAX = 4096;
89+
90+ private LinkedList<int>[] codehash;
91+ private LinkedListNode<int>[] nodes;
92+
93+ public LZSSDeflateWindow()
94+ {
95+ codehash = new LinkedList<int>[HASH_MAX];
96+ nodes = new LinkedListNode<int>[WINDOW_MAX];
97+
98+ for (int i = 0; i < WINDOW_MAX; ++i)
99+ nodes[i] = new LinkedListNode<int>(i);
100+ }
101+
102+ public LinkedListNode<int> GetNode(int off)
103+ {
104+ return nodes[(current + off) & WINDOW_MASK];
105+ }
106+
107+ public LinkedList<int> GetHashedList(int hash)
108+ {
109+ if (codehash[hash] != null)
110+ return codehash[hash];
111+
112+ return codehash[hash] = new LinkedList<int>();
113+ }
114+
115+ public LinkedList<int> FindHashedList(int hash)
116+ {
117+ return codehash[hash];
118+ }
119+
120+ public void UpdateHash(int off)
121+ {
122+ LinkedListNode<int> node = GetNode(off);
123+ if (node.List != null) node.List.Remove(node); // まだリンクされていないnodeの場合null参照になる.
124+ GetHashedList(CalcHash(off)).AddLast(GetNode(off));
125+ }
126+
127+ public void Back(byte b)
128+ {
129+ current = (current - 1) & WINDOW_MASK; --fill;
130+ Push(b);
131+ current = (current - 1) & WINDOW_MASK; --fill;
132+ }
133+
134+ public new byte Push(byte b)
135+ {
136+ byte old = CurrentByte;
137+ CurrentByte = b;
138+
139+ UpdateHash(-2);
140+ UpdateHash(-1);
141+ UpdateHash(0);
142+ Advance();
143+
144+ return old;
145+ }
146+
147+ public void Push(byte[] b, int off, int len)
148+ {
149+ for (int i = 0; i < len; ++i)
150+ base.Put(i, b[off + i]);
151+
152+ for (int i = -2; i < len; ++i)
153+ UpdateHash(i);
154+
155+ Advance(len);
156+ }
157+
158+ public bool FindMatch(byte[] data, int begin, ref int matchoff, ref int matchlen)
159+ {
160+ return FindMatch(data, begin, data.Length - begin, ref matchoff, ref matchlen);
161+ }
162+
163+ public bool FindMatch(byte[] data, int begin, int length, ref int matchoff, ref int matchlen)
164+ {
165+ if (length < LENGTH_MIN)
166+ return false;
167+
168+ // ハッシュを計算して先頭3バイトが一致するか確認する
169+ int hash = CalcHash(data[begin + 0], data[begin + 1], data[begin + 2]);
170+ LinkedList<int> hashLinkedList = FindHashedList(hash);
171+
172+ // ハッシュが無い、空の場合一致なしとする
173+ if (hashLinkedList == null || hashLinkedList.Count == 0)
174+ return false;
175+
176+ // 最長マッチを求める
177+ int matchPosition = 0;
178+ int matchLength = LENGTH_MIN - 1;
179+ int matchLimitLength = Math.Min(length, LENGTH_MAX);
180+
181+ foreach (int hashSpecifiedOffset in hashLinkedList)
182+ {
183+ int j = 0;
184+
185+ if (window[(hashSpecifiedOffset + matchLength) & WINDOW_MASK] != data[begin + matchLength])
186+ continue;
187+
188+ for (j = 0; j < matchLimitLength; ++j)
189+ if (j + hashSpecifiedOffset >= fill || window[(j + hashSpecifiedOffset) & WINDOW_MASK] != data[begin + j])
190+ break;
191+
192+ // N765/Konoa 辞書を上書きするオフセットはスキップする
193+ int distance = (current - hashSpecifiedOffset) & WINDOW_MASK;
194+ if (distance <= j) continue;
195+
196+ if (j > matchLength)
197+ {
198+ matchPosition = hashSpecifiedOffset;
199+ matchLength = j;
200+
201+ if (matchLength == matchLimitLength)
202+ break;
203+ }
204+ }
205+
206+ if (matchLength < LENGTH_MIN)
207+ return false;
208+
209+ matchoff = (matchPosition - 16) & WINDOW_MASK;
210+ //matchoff = (current - mpos) & WINDOW_MASK;
211+ matchlen = matchLength;
212+
213+ return true;
214+ }
215+ }
216+
217+ // 圧縮
218+ public class LZSSDeflate
219+ {
220+ private LZSSDeflateWindow window = new LZSSDeflateWindow();
221+ //private MemoryStream ms;
222+ private Stream s;
223+
224+ public LZSSDeflate(Stream s)
225+ {
226+ //this.ms = ms;
227+ this.s = s;
228+ }
229+
230+ public void Deflate(byte[] data)
231+ {
232+ int off = 0, len = 0;
233+ long elempos = 0;
234+ int elems = 0;
235+ int elemdata = 0;
236+
237+ s.WriteByte(0);
238+
239+ for (int i = 0; i < data.Length; )
240+ {
241+ if (window.FindMatch(data, i, ref off, ref len))
242+ { // マッチ
243+#if true // さらに最適なマッチがないか1バイト先をマッチさせて見る
244+ int off2 = 0;
245+ int len2 = 0;
246+
247+ // 仮にLiteralをひとつおく
248+ byte old = window.Push(data[i]);
249+
250+ if (window.FindMatch(data, i + 1, ref off2, ref len2))
251+ {
252+ if (len2 > len + 1) // より長くマッチ
253+ { //
254+ window.Back(old);
255+ goto LABLE_LITREAL;
256+ }
257+ }
258+
259+ window.Back(old);
260+#endif
261+
262+ s.WriteByte((byte)(off & 255));
263+ s.WriteByte((byte)(((off & 0x0F00) >> 4) | ((byte)(len - 3))));
264+
265+ window.Push(data, i, len);
266+ i += len;
267+ goto LABEL_DONE;
268+ }
269+
270+ // リテラル
271+ LABLE_LITREAL:
272+ if (TAHUtil.debug)
273+ System.Diagnostics.Debug.WriteLine("Literal: " + data[i].ToString("X").PadLeft(2, '0'));
274+
275+ elemdata |= 1 << elems;
276+ s.WriteByte(data[i]);
277+ window.Push(data[i++]);
278+
279+ LABEL_DONE:
280+ ++elems;
281+
282+ if (elems == 8)
283+ { //
284+ elempos = FlushElem(elempos, elemdata);
285+ elems = 0;
286+ elemdata = 0;
287+ }
288+ }
289+
290+ if (elems != 0)
291+ FlushElem(elempos, elemdata);
292+
293+ s.Seek(-1, SeekOrigin.Current);
294+ s.SetLength(s.Position);
295+ s.Flush();
296+ }
297+
298+ public long FlushElem(long pos, int elem)
299+ {
300+ long save = s.Position;
301+ s.Seek(pos, SeekOrigin.Begin);
302+ s.WriteByte((byte)elem);
303+ s.Seek(save + 1, SeekOrigin.Begin);
304+ return save;
305+ }
306+ }
307+
308+ // 解凍
309+ public class LZSSInflate
310+ {
311+ private MemoryStream ms;
312+ private LZSSWindow window = new LZSSWindow();
313+
314+ public int InflatedSize { get { return (int)ms.Position; } }
315+
316+ public LZSSInflate(MemoryStream ms)
317+ {
318+ this.ms = ms;
319+ }
320+
321+ public void Inflate(Stream s)
322+ {
323+ using (BinaryReader br = new BinaryReader(s))
324+ {
325+ int elemdata = br.ReadByte();
326+ int elems = 0;
327+
328+ byte b;
329+
330+ try
331+ {
332+ for (; ; )
333+ {
334+ if ((elemdata & (1 << elems)) == 0)
335+ { // マッチ
336+ int off = br.ReadByte();
337+ int len = br.ReadByte();
338+ off |= (len & 0xF0) << 4;
339+ len = (len & 15) + 3;
340+
341+ off += 16;
342+
343+ for (int j = 0; j < len; ++j)
344+ {
345+ ms.WriteByte(b = window.GetAbs(off + j));
346+ window.Push(b);
347+
348+ if (ms.Length == ms.Position)
349+ break;
350+ }
351+ }
352+ else
353+ { // リテラル
354+ ms.WriteByte(b = br.ReadByte());
355+ window.Push(b);
356+
357+ if (TAHUtil.debug)
358+ System.Diagnostics.Debug.WriteLine("Literal:" + b.ToString("X").PadLeft(2, '0'));
359+ }
360+
361+ if (ms.Position == ms.Length)
362+ break;
363+
364+ ++elems;
365+
366+ if (elems == 8)
367+ {
368+ elems = 0;
369+ elemdata = br.ReadByte();
370+ }
371+ }
372+ }
373+ catch (EndOfStreamException)
374+ {
375+ }
376+ }
377+ }
378+
379+ public void Inflate(byte[] data)
380+ {
381+ using (MemoryStream stream = new MemoryStream(data, false))
382+ {
383+ Inflate(stream);
384+ }
385+ }
386+ }
387+}
388+
--- TSOSorter/Source/TDCG/TAHFile.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHFile.cs (revision 3)
@@ -0,0 +1,387 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Diagnostics;
7+
8+namespace TDCGExplorer
9+{
10+ public class TAHFile : IDisposable
11+ {
12+ private string FileName_;
13+ private TAHHeader Header_;
14+ private TAHEntrySet EntrySet_;
15+ private TAHDirectories Files_;
16+ private object Tag_;
17+ private Stream Stream_;
18+ private BinaryReader Reader_;
19+
20+ public string FileName { get { return FileName_; } set { FileName_ = value; } }
21+ public TAHHeader Header { get { return Header_; } set { Header_ = value; } }
22+ public TAHEntrySet EntrySet { get { return EntrySet_; } set { EntrySet_ = value; } }
23+ public TAHDirectories Files { get { return Files_; } set { Files_ = value; } }
24+ public object Tag { get { return Tag_; } set { Tag_ = value; } }
25+ public Stream Stream { get { return Stream_; } set { Stream_ = value; } }
26+ public BinaryReader Reader { get { return Reader_; } set { Reader_ = value; } }
27+
28+ public TAHFile(string filename)
29+ {
30+ FileName = filename;
31+ TSOSorter.TDCGExplorer.LastAccessFile = filename;
32+ Stream = File.OpenRead(FileName);
33+ Reader = new BinaryReader(Stream);
34+ }
35+
36+ public TAHFile(Stream stream)
37+ {
38+ Stream = stream;
39+ Reader = new BinaryReader(Stream);
40+ }
41+
42+ public void Dispose()
43+ {
44+ if (Stream != null)
45+ {
46+ Stream.Dispose();
47+ Stream = null;
48+ }
49+ }
50+
51+ public void LoadEntries()
52+ {
53+ Header = TAHHeader.Load(Reader);
54+ EntrySet = TAHEntrySet.Load(Reader, this);
55+ Files = TAHDirectories.Load(Reader, this);
56+ }
57+
58+ public TAHContent LoadContent(BinaryReader br, TAHEntry e)
59+ {
60+ return new TAHContent(e, TAHUtil.ReadEntryData(br, e));
61+ }
62+ }
63+
64+ public class TAHHeader
65+ {
66+ public const uint MAGIC = 0x32484154;
67+
68+ private uint Magic_;
69+ private int NumEntries_;
70+ private uint Version_;
71+ private uint Unknown2_;
72+
73+ public uint Magic { get { return Magic_; } set { Magic_ = value; } }
74+ public int NumEntries { get { return NumEntries_; } set { NumEntries_ = value; } }
75+ public uint Version { get { return Version_; } set { Version_ = value; } }
76+ public uint Unknown2 { get { return Unknown2_; } set { Unknown2_ = value; } }
77+
78+ public static TAHHeader Load(BinaryReader br)
79+ {
80+ TAHHeader h = new TAHHeader();
81+ h.Read(br);
82+ return h;
83+ }
84+
85+ public void Read(BinaryReader br)
86+ {
87+ Magic = br.ReadUInt32();
88+ NumEntries = br.ReadInt32();
89+ Version = br.ReadUInt32();
90+ Unknown2 = br.ReadUInt32();
91+
92+ if (Magic != TAHHeader.MAGIC)
93+ throw new Exception("Invalid TAH Magic no");
94+ }
95+
96+ public void Write(BinaryWriter bw)
97+ {
98+ bw.Write(Magic);
99+ bw.Write(NumEntries);
100+ bw.Write(Version);
101+ bw.Write(Unknown2);
102+ }
103+ }
104+
105+ public struct ext_file_list
106+ {
107+ public string[] files;
108+ public UInt32[] hashkeys;
109+ }
110+
111+ public class TAHEntrySet
112+ {
113+ private List<TAHEntry> Entries_;
114+ private Dictionary<uint, TAHEntry> EntryMap_;
115+
116+ public List<TAHEntry> Entries { get { return Entries_; } set { Entries_ = value; } }
117+ public Dictionary<uint, TAHEntry> EntryMap { get { return EntryMap_; } set { EntryMap_ = value; } }
118+
119+ public static TAHEntrySet Load(BinaryReader br, TAHFile file)
120+ {
121+ TAHEntrySet es = new TAHEntrySet();
122+ es.Read(br, file);
123+ return es;
124+ }
125+
126+ public void Read(BinaryReader br, TAHFile file)
127+ {
128+ Entries = new List<TAHEntry>(file.Header.NumEntries);
129+ EntryMap = new Dictionary<uint, TAHEntry>();
130+
131+ for (int i = 0, n = file.Header.NumEntries; i < n; ++i)
132+ {
133+ TAHEntry e = TAHEntry.Load(br, file);
134+
135+ if (i != 0)
136+ TailEntry.Length = (int)(e.DataOffset - TailEntry.DataOffset);
137+ //Console.WriteLine(e.ToString());
138+ Entries.Add(e);
139+ if (EntryMap.ContainsKey(e.Hash))
140+ //Console.WriteLine("Error: delect hashkey collision. " + e.Hash.ToString("X8") + ": " + e.DataOffset.ToString());
141+ Debug.WriteLine("Error: detect hashkey collision. " + e.Hash.ToString("X8") + ": " + e.DataOffset.ToString());
142+ else
143+ EntryMap.Add(e.Hash, e);
144+ }
145+
146+ TailEntry.Length = (int)(br.BaseStream.Length - TailEntry.DataOffset);
147+ }
148+
149+ public bool TryGetValue(uint hash, out TAHEntry e)
150+ {
151+ return EntryMap.TryGetValue(hash, out e);
152+ }
153+
154+ public TAHEntry TailEntry { get { return Entries[Count - 1]; } }
155+ public int Count { get { return Entries.Count; } }
156+ public TAHEntry this[int index] { get { return Entries[index]; } }
157+ public TAHEntry this[uint index] { get { return EntryMap[index]; } }
158+ }
159+
160+ public class TAHEntry
161+ {
162+#if false
163+ private TAHFile Owner_;
164+#endif
165+ private uint Hash_;
166+ private uint DataOffset_;
167+ private int Length_;
168+ private string FileName_;
169+#if false
170+ public TAHFile Owner { get { return Owner_; } set { Owner_ = value; } }
171+#endif
172+ public uint Hash { get { return Hash_; } set { Hash_ = value; } }
173+ public uint DataOffset { get { return DataOffset_; } set { DataOffset_ = value; } }
174+ public int Length { get { return Length_; } set { Length_ = value; } }
175+ public string FileName { get { return FileName_; } set { FileName_ = value; } }
176+
177+ public static TAHEntry Load(BinaryReader br, TAHFile file)
178+ {
179+ TAHEntry h = new TAHEntry();
180+ h.Read(br, file);
181+ return h;
182+ }
183+
184+ static ext_file_list external_files;
185+
186+ public static void ReadExternalFileList()
187+ {
188+ external_files = new ext_file_list();
189+
190+ if (System.IO.File.Exists("names.txt"))
191+ {
192+ System.IO.StreamReader reader = new System.IO.StreamReader(System.IO.File.OpenRead("names.txt"));
193+ List<string> known_files = new List<string>();
194+ string line;
195+ while ((line = reader.ReadLine()) != null)
196+ {
197+ known_files.Add(line);
198+ }
199+ //map a list of hash keys to the file...
200+ external_files.files = known_files.ToArray();
201+ if (external_files.files != null)
202+ {
203+ external_files.hashkeys = new UInt32[external_files.files.Length];
204+ for (int i = 0; i < external_files.files.Length; i++)
205+ {
206+ external_files.hashkeys[i] = TAHUtil.CalcHash(external_files.files[i]);
207+ //Console.WriteLine(external_files.hashkeys[i].ToString("X8") + "\t" + external_files.files[i]);
208+ }
209+ }
210+ //sorting for faster look up...
211+ Array.Sort(external_files.hashkeys, external_files.files);
212+ }
213+ }
214+
215+ public string FindExternalFileName(uint hashkey)
216+ {
217+ if (external_files.files != null)
218+ {
219+ //Console.WriteLine("search hashkey. " + hashkey.ToString("X8"));
220+ int pos = Array.BinarySearch(external_files.hashkeys, hashkey);
221+ if (pos >= 0)
222+ {
223+ //Console.WriteLine("filename found. " + external_files.hashkeys[pos].ToString("X8") + "\t" + external_files.files[pos]);
224+ return external_files.files[pos];
225+ }
226+ }
227+ return null;
228+ }
229+
230+ public void Read(BinaryReader br, TAHFile file)
231+ {
232+ Hash = br.ReadUInt32();
233+ FileName = FindExternalFileName(Hash);
234+ DataOffset = br.ReadUInt32();
235+#if false
236+ Owner = file;
237+#endif
238+ }
239+
240+ public void Write(BinaryWriter bw)
241+ {
242+ bw.Write(Hash);
243+ bw.Write(DataOffset);
244+ }
245+
246+ public override string ToString()
247+ {
248+#if false
249+ return Hash.ToFormattedString("X", 8, '0')
250+ + ": " + DataOffset + ", " + Length
251+ + (FileName != null ? FileName : "(unknown)");
252+#else
253+ return String.Format("{0:X8} ", Hash)
254+ + ": " + DataOffset + ", " + Length
255+ + (FileName != null ? FileName : "(unknown)");
256+#endif
257+ }
258+ }
259+
260+ public class TAHDirectories
261+ {
262+ private List<string> Files_;
263+
264+ public List<string> Files { get { return Files_; } set { Files_ = value; } }
265+
266+ public string this[int index]
267+ {
268+ get { return Files[index]; }
269+ }
270+
271+ // デフォルトコンストラクタ
272+ public TAHDirectories()
273+ {
274+ Files_ = new List<string>();
275+ }
276+
277+ public static TAHDirectories Load(BinaryReader br, TAHFile file)
278+ {
279+ TAHDirectories dir = new TAHDirectories();
280+ dir.Read(br, file);
281+ return dir;
282+ }
283+
284+ public void Write(BinaryWriter bw)
285+ {
286+ MemoryStream ms = new MemoryStream();
287+ BinaryWriter bw2 = new BinaryWriter(ms);
288+
289+ foreach (string i in Files)
290+ {
291+ if (i.EndsWith("/"))
292+ TAHUtil.WriteString(bw2, i);
293+ else TAHUtil.WriteString(bw2, Path.GetFileName(i));
294+ }
295+
296+ bw2.Flush();
297+ byte[] encrypted = TAHUtil.Encrypt(ms.ToArray());
298+
299+ bw.Write((uint)ms.Length);
300+ bw.Write(encrypted);
301+ }
302+
303+ public void Read(BinaryReader br, TAHFile file)
304+ {
305+ // ディレクトリデータの読み込み
306+ Files = new List<string>(file.Header.NumEntries);
307+ int output_length = br.ReadInt32();
308+ int input_length = (int)(file.EntrySet[0].DataOffset - br.BaseStream.Position); //- 16 - 8 * file.Header.NumEntries;
309+ byte[] input = br.ReadBytes(input_length);
310+ byte[] output = new byte[output_length];
311+
312+ if (output.Length == 0)
313+ return;
314+
315+ // add konoa:tahdecryptorのバグ回避.
316+ if (input.Length == 0)
317+ return;
318+
319+ TAHUtil.Decrypt(input, output);
320+ //TAHdecrypt.Decrypter.decrypt(ref input, (uint)input.Length, ref output, (uint)output.Length);
321+
322+ MemoryStream ms = new MemoryStream(output);
323+ BinaryReader br2 = new BinaryReader(ms);
324+
325+ try
326+ {
327+ string dir = "";
328+
329+ while (ms.Position < ms.Length)
330+ {
331+ string name = TAHUtil.ReadString(br2);
332+
333+ if (name.Length == 0)
334+ {
335+ }
336+ else
337+ if (name.EndsWith("/"))
338+ {
339+ dir = name;
340+ //DbgPrint("Directory: " + dir);
341+ }
342+ else
343+ {
344+ name = dir + name;
345+ uint hash = TAHUtil.CalcHash(name);
346+ TAHEntry ent;
347+
348+ //DbgPrint(hash.ToString("X").PadLeft(8, '0'));
349+
350+ if (file.EntrySet.TryGetValue(hash, out ent))
351+ {
352+ ent.FileName = name;
353+ //DbgPrint(": Found: " + file);
354+ }
355+ else
356+ {
357+ //DbgPrint(": Not Found: " + file);
358+ System.Diagnostics.Debug.Assert(false);
359+ }
360+
361+ //EntryMap[hash].FileName = FileName;
362+ }
363+
364+ Files.Add(name);
365+ }
366+ }
367+ catch (EndOfStreamException)
368+ {
369+ }
370+ }
371+ }
372+
373+ public class TAHContent
374+ {
375+ private TAHEntry Entry_;
376+ private byte[] Data_;
377+
378+ public TAHEntry Entry { get { return Entry_; } set { Entry_ = value; } }
379+ public byte[] Data { get { return Data_; } set { Data_ = value; } }
380+
381+ public TAHContent(TAHEntry e, byte[] data)
382+ {
383+ Entry = e;
384+ Data = data;
385+ }
386+ }
387+}
--- TSOSorter/Source/TDCG/mt19937.cs (nonexistent)
+++ TSOSorter/Source/TDCG/mt19937.cs (revision 3)
@@ -0,0 +1,201 @@
1+/*
2+ A C-program for MT19937, with initialization improved 2002/1/26.
3+ Coded by Takuji Nishimura and Makoto Matsumoto.
4+
5+ Before using, initialize the state by using init_genrand(seed)
6+ or init_by_array(init_key, key_length).
7+
8+ Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
9+ All rights reserved.
10+
11+ Redistribution and use in source and binary forms, with or without
12+ modification, are permitted provided that the following conditions
13+ are met:
14+
15+ 1. Redistributions of source code must retain the above copyright
16+ notice, this list of conditions and the following disclaimer.
17+
18+ 2. Redistributions in binary form must reproduce the above copyright
19+ notice, this list of conditions and the following disclaimer in the
20+ documentation and/or other materials provided with the distribution.
21+
22+ 3. The names of its contributors may not be used to endorse or promote
23+ products derived from this software without specific prior written
24+ permission.
25+
26+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
30+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37+
38+
39+ Any feedback is very welcome.
40+ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
41+ email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
42+*/
43+
44+public class mt19937
45+{
46+ /* Period parameters */
47+ public const int N = 624;
48+ public const int M = 397;
49+ public const uint MATRIX_A = 0x9908b0dfU; /* constant vector a */
50+ public const uint UPPER_MASK = 0x80000000U; /* most significant w-r bits */
51+ public const uint LOWER_MASK = 0x7fffffffU; /* least significant r bits */
52+
53+ static uint[] mt = new uint[N]; /* the array for the state vector */
54+ static int mti = N + 1; /* mti==N+1 means mt[N] is not initialized */
55+
56+ /* initializes mt[N] with a seed */
57+ public static void init_genrand(uint s)
58+ {
59+ mt[0] = s & 0xffffffffU;
60+ for (mti = 1; mti < N; mti++)
61+ {
62+ mt[mti] = (uint)
63+ (1812433253U * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
64+ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
65+ /* In the previous versions, MSBs of the seed affect */
66+ /* only MSBs of the array mt[]. */
67+ /* 2002/01/09 modified by Makoto Matsumoto */
68+ mt[mti] &= 0xffffffffU;
69+ /* for >32 bit machines */
70+ }
71+ }
72+
73+ /* initialize by an array with array-length */
74+ /* init_key is the array for initializing keys */
75+ /* key_length is its length */
76+ /* slight change for C++, 2004/2/26 */
77+ public static void init_by_array(uint[] init_key, int key_length)
78+ {
79+ int i, j, k;
80+ init_genrand(19650218U);
81+ i = 1; j = 0;
82+ k = (N > key_length ? N : key_length);
83+ for (; k != 0; k--)
84+ {
85+ mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1664525U))
86+ + init_key[j] + (uint)j; /* non linear */
87+ mt[i] &= 0xffffffffU; /* for WORDSIZE > 32 machines */
88+ i++; j++;
89+ if (i >= N) { mt[0] = mt[N - 1]; i = 1; }
90+ if (j >= key_length) j = 0;
91+ }
92+ for (k = N - 1; k != 0; k--)
93+ {
94+ mt[i] = (mt[i] ^ ((mt[i - 1] ^ (mt[i - 1] >> 30)) * 1566083941U))
95+ - (uint)i; /* non linear */
96+ mt[i] &= 0xffffffffU; /* for WORDSIZE > 32 machines */
97+ i++;
98+ if (i >= N) { mt[0] = mt[N - 1]; i = 1; }
99+ }
100+
101+ mt[0] = 0x80000000U; /* MSB is 1; assuring non-zero initial array */
102+ }
103+
104+ static uint[] mag01 = new uint[] { 0x0U, MATRIX_A };
105+
106+ /* generates a random number on [0,0xffffffff]-interval */
107+ public static uint genrand_int32()
108+ {
109+ uint y;
110+ /* mag01[x] = x * MATRIX_A for x=0,1 */
111+
112+ if (mti >= N)
113+ { /* generate N words at one time */
114+ int kk;
115+
116+ if (mti == N + 1) /* if init_genrand() has not been called, */
117+ init_genrand(5489U); /* a default initial seed is used */
118+
119+ for (kk = 0; kk < N - M; kk++)
120+ {
121+ y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
122+ mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1UL];
123+ }
124+ for (; kk < N - 1; kk++)
125+ {
126+ y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
127+ mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
128+ }
129+ y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
130+ mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL];
131+
132+ mti = 0;
133+ }
134+
135+ y = mt[mti++];
136+
137+ /* Tempering */
138+ y ^= (y >> 11);
139+ y ^= (y << 7) & 0x9d2c5680U;
140+ y ^= (y << 15) & 0xefc60000U;
141+ y ^= (y >> 18);
142+
143+ return y;
144+ }
145+
146+ /* generates a random number on [0,0x7fffffff]-interval */
147+ public static int genrand_int31()
148+ {
149+ return (int)(genrand_int32() >> 1);
150+ }
151+
152+ /* generates a random number on [0,1]-real-interval */
153+ public static double genrand_real1()
154+ {
155+ return genrand_int32() * (1.0 / 4294967295.0);
156+ /* divided by 2^32-1 */
157+ }
158+
159+ /* generates a random number on [0,1)-real-interval */
160+ public static double genrand_real2()
161+ {
162+ return genrand_int32() * (1.0 / 4294967296.0);
163+ /* divided by 2^32 */
164+ }
165+
166+ /* generates a random number on (0,1)-real-interval */
167+ public static double genrand_real3()
168+ {
169+ return (((double)genrand_int32()) + 0.5) * (1.0 / 4294967296.0);
170+ /* divided by 2^32 */
171+ }
172+
173+ /* generates a random number on [0,1) with 53-bit resolution*/
174+ public static double genrand_res53()
175+ {
176+ uint a = genrand_int32() >> 5, b = genrand_int32() >> 6;
177+ return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
178+ }
179+ /* These real versions are due to Isaku Wada, 2002/01/09 added */
180+
181+ public static int main()
182+ {
183+ int i;
184+ uint[] init = new uint[] { 0x123, 0x234, 0x345, 0x456 };
185+ int length = 4;
186+ init_by_array(init, length);
187+ System.Diagnostics.Debug.Write("1000 outputs of genrand_int32()\n");
188+ for (i = 0; i < 1000; i++)
189+ {
190+ System.Diagnostics.Debug.Write("{0} ", genrand_int32().ToString().PadLeft(10));
191+ if (i % 5 == 4) System.Diagnostics.Debug.Write("\n");
192+ }
193+ System.Diagnostics.Debug.Write("\n1000 outputs of genrand_real2()\n");
194+ for (i = 0; i < 1000; i++)
195+ {
196+ System.Diagnostics.Debug.Write("{0} ", genrand_real2().ToString("N8").PadLeft(10));
197+ if (i % 5 == 4) System.Diagnostics.Debug.Write("\n");
198+ }
199+ return 0;
200+ }
201+}
--- TSOSorter/Source/TDCG/TAHDatabase.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHDatabase.cs (revision 3)
@@ -0,0 +1,331 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Data.SQLite;
7+using System.Diagnostics;
8+
9+namespace TDCGExplorer
10+{
11+ public class TAHLocalDbEntry
12+ {
13+ public string path;
14+ public int hash;
15+ public int dataid;
16+ }
17+ public class TAHLocalDBDataEntry
18+ {
19+ public int dataid;
20+ public byte[] data;
21+ }
22+ // TAHコンテナ
23+ public class TAHLocalDB : IDisposable
24+ {
25+ string filepath = null;
26+ private SQLiteConnection cnn = null;
27+
28+ public TAHLocalDB()
29+ {
30+ }
31+
32+ public void Dispose()
33+ {
34+ if (cnn != null)
35+ {
36+ cnn.Close();
37+ cnn.Dispose();
38+ cnn = null;
39+ }
40+ }
41+
42+ // データベースをオープンする.
43+ public void Open(string path)
44+ {
45+ filepath = path;
46+
47+ if (cnn != null) cnn.Close();
48+
49+ Directory.CreateDirectory(Path.GetDirectoryName(filepath));
50+ cnn = new SQLiteConnection("Data Source=" + filepath);
51+ cnn.Open();
52+
53+ try
54+ {
55+ using (SQLiteCommand cmd = cnn.CreateCommand())
56+ {
57+ cmd.CommandText = "CREATE TABLE Entry (PATH TEXT PRIMARY KEY, DATAID INTEGER, HASH INTEGER)";
58+ cmd.ExecuteNonQuery();
59+ }
60+ }
61+ catch (Exception e)
62+ {
63+ Debug.WriteLine(e.Message);
64+ }
65+
66+ try
67+ {
68+ using (SQLiteCommand cmd = cnn.CreateCommand())
69+ {
70+ cmd.CommandText = "CREATE TABLE Data (DATAID INTEGER PRIMARY KEY, DATA BLOB)";
71+ cmd.ExecuteNonQuery();
72+ }
73+ }
74+ catch (Exception e)
75+ {
76+ Debug.WriteLine(e.Message);
77+ }
78+
79+ try
80+ {
81+ using (SQLiteCommand cmd = cnn.CreateCommand())
82+ {
83+ cmd.CommandText = "CREATE TABLE Information (ID TEXT PRIMARY KEY, VALUE TEXT)";
84+ cmd.ExecuteNonQuery();
85+ }
86+ }
87+ catch (Exception e)
88+ {
89+ Debug.WriteLine(e.Message);
90+ }
91+
92+ }
93+
94+ public int AddData(TAHLocalDBDataEntry entry)
95+ {
96+ int id = -1;
97+ using (SQLiteCommand cmd = cnn.CreateCommand())
98+ {
99+ // acpathを追加する.
100+ cmd.CommandText = "INSERT INTO Data (DATA) VALUES(@data)";
101+ cmd.Parameters.AddWithValue("data", entry.data);
102+ cmd.ExecuteNonQuery();
103+
104+ cmd.CommandText = "SELECT last_insert_rowid()";
105+ using (SQLiteDataReader reader = cmd.ExecuteReader())
106+ {
107+ while (reader.Read())
108+ {
109+ id = Int16.Parse(reader[0].ToString());
110+ break;
111+ }
112+ }
113+ }
114+ return id;
115+ }
116+
117+ // データを格納する.
118+ public void AddContent(TAHLocalDbEntry entry)
119+ {
120+ using (SQLiteCommand cmd = cnn.CreateCommand())
121+ {
122+ // acpathを追加する.
123+ cmd.CommandText = "INSERT INTO Entry (PATH,DATAID,HASH) VALUES(@path,@id,@hash)";
124+ cmd.Parameters.AddWithValue("path", entry.path);
125+ cmd.Parameters.AddWithValue("id", entry.dataid);
126+ cmd.Parameters.AddWithValue("hash", (int)entry.hash);
127+ cmd.ExecuteNonQuery();
128+ }
129+ }
130+
131+ // データ一覧を取得する.
132+ public List<string> GetDirectory()
133+ {
134+ List<string> list = new List<string>();
135+ using (SQLiteCommand cmd = cnn.CreateCommand())
136+ {
137+ cmd.CommandText = "SELECT PATH FROM Entry ORDER BY PATH";
138+ using (SQLiteDataReader reader = cmd.ExecuteReader())
139+ {
140+ while (reader.Read())
141+ {
142+ list.Add(reader[0].ToString());
143+ }
144+ }
145+ }
146+ return list;
147+ }
148+
149+ // エントリを取得する
150+ public TAHLocalDbEntry GetEntry(string path)
151+ {
152+ TAHLocalDbEntry entry = null;
153+ using (SQLiteCommand cmd = cnn.CreateCommand())
154+ {
155+ cmd.CommandText = "SELECT PATH,DATAID,HASH FROM Entry WHERE UPPER(PATH)=UPPER(@path)";
156+ cmd.Parameters.AddWithValue("path", path);
157+ using (SQLiteDataReader reader = cmd.ExecuteReader())
158+ {
159+ while (reader.Read())
160+ {
161+ entry = new TAHLocalDbEntry();
162+ entry.path = reader[0].ToString();
163+ entry.dataid = int.Parse(reader[1].ToString());
164+ entry.hash = int.Parse(reader[2].ToString());
165+ break;
166+ }
167+ }
168+ }
169+ return entry;
170+ }
171+
172+ // エントリを取得する
173+ public TAHLocalDbEntry GetEntryHash(int hash)
174+ {
175+ TAHLocalDbEntry entry = null;
176+ using (SQLiteCommand cmd = cnn.CreateCommand())
177+ {
178+ cmd.CommandText = "SELECT PATH,DATAID,HASH FROM Entry WHERE HASH=@hash";
179+ cmd.Parameters.AddWithValue("hash", hash.ToString());
180+ using (SQLiteDataReader reader = cmd.ExecuteReader())
181+ {
182+ while (reader.Read())
183+ {
184+ entry = new TAHLocalDbEntry();
185+ entry.path = reader[0].ToString();
186+ entry.dataid = int.Parse(reader[1].ToString());
187+ entry.hash = int.Parse(reader[2].ToString());
188+ break;
189+ }
190+ }
191+ }
192+ return entry;
193+ }
194+ // cmd.CommandText = "CREATE TABLE Data (DATAID PRIMARY KEY, DATA BLOB)";
195+
196+ // データを取得する
197+ public TAHLocalDBDataEntry GetData(int id)
198+ {
199+ TAHLocalDBDataEntry entry = null;
200+ using (SQLiteCommand cmd = cnn.CreateCommand())
201+ {
202+ cmd.CommandText = "SELECT DATAID,DATA FROM Data WHERE DATAID=@id";
203+ cmd.Parameters.AddWithValue("id", id.ToString());
204+ using (SQLiteDataReader reader = cmd.ExecuteReader())
205+ {
206+ while (reader.Read())
207+ {
208+ entry = new TAHLocalDBDataEntry();
209+ entry.dataid = int.Parse(reader[0].ToString());
210+ entry.data = (byte[])reader[1];
211+ break;
212+ }
213+ }
214+ }
215+ return entry;
216+ }
217+
218+ // データを更新するする
219+ public void UpdateData(TAHLocalDBDataEntry entry)
220+ {
221+ using (SQLiteCommand cmd = cnn.CreateCommand())
222+ {
223+ cmd.CommandText = "UPDATE Data SET DATA=@data WHERE DATAID=@id";
224+ cmd.Parameters.AddWithValue("id", entry.dataid.ToString());
225+ cmd.Parameters.AddWithValue("data", entry.data);
226+ cmd.ExecuteNonQuery();
227+ }
228+ }
229+
230+
231+ // エントリを削除する.
232+ public void DeleteEntry(string path)
233+ {
234+ using (SQLiteCommand cmd = cnn.CreateCommand())
235+ {
236+ // acpathを追加する.
237+ cmd.CommandText = "DELETE FROM Entry WHERE PATH=@path";
238+ cmd.Parameters.AddWithValue("path", path);
239+ cmd.ExecuteNonQuery();
240+ }
241+ }
242+
243+ // エントリを削除する.
244+ public void DeleteEntry(int id)
245+ {
246+ using (SQLiteCommand cmd = cnn.CreateCommand())
247+ {
248+ // acpathを追加する.
249+ cmd.CommandText = "DELETE FROM Entry WHERE ID=@id";
250+ cmd.Parameters.AddWithValue("id", id);
251+ cmd.ExecuteNonQuery();
252+ }
253+ }
254+
255+ // データを削除する.
256+ public void DeleteData(int dataid)
257+ {
258+ using (SQLiteCommand cmd = cnn.CreateCommand())
259+ {
260+ // acpathを追加する.
261+ cmd.CommandText = "DELETE FROM Data WHERE DATAID=@ID";
262+ cmd.Parameters.AddWithValue("id", dataid.ToString());
263+ cmd.ExecuteNonQuery();
264+ }
265+ }
266+
267+ // データを削除する.
268+
269+ // 値を読み出す.
270+ private string GetInformationValue(string id)
271+ {
272+ string value = "";
273+ try
274+ {
275+ using (SQLiteCommand cmd = cnn.CreateCommand())
276+ {
277+ cmd.CommandText = "SELECT VALUE FROM Information WHERE ID=@id";
278+ cmd.Parameters.AddWithValue("id", id);
279+ using (SQLiteDataReader reader = cmd.ExecuteReader())
280+ {
281+ while (reader.Read())
282+ {
283+ value = reader[0].ToString();
284+ break;
285+ }
286+ }
287+ }
288+ }
289+ catch (Exception e)
290+ {
291+ Debug.WriteLine(e.Message);
292+ }
293+ return value;
294+ }
295+
296+ // 値を設定する.
297+ private void SetInformationValue(string id, string value)
298+ {
299+ // 値を追加する.
300+ try
301+ {
302+ using (SQLiteCommand cmd = cnn.CreateCommand())
303+ {
304+ // acpathを追加する.
305+ cmd.CommandText = "INSERT OR REPLACE INTO Information (ID,VALUE) VALUES(@id,@value)";
306+ cmd.Parameters.AddWithValue("id", id);
307+ cmd.Parameters.AddWithValue("value", value);
308+ cmd.ExecuteNonQuery();
309+ }
310+ }
311+ catch (Exception e)
312+ {
313+ Debug.WriteLine(e.Message);
314+ }
315+ }
316+
317+ // informationアクセス
318+ public string this[string key]
319+ {
320+ get { return GetInformationValue(key); }
321+ set { SetInformationValue(key, value); }
322+ }
323+
324+ //トランザクションを開始する.
325+ public SQLiteTransaction BeginTransaction()
326+ {
327+ return cnn.BeginTransaction();
328+ }
329+
330+ }
331+}
--- TSOSorter/Source/TDCG/GenTahInfo.cs (nonexistent)
+++ TSOSorter/Source/TDCG/GenTahInfo.cs (revision 3)
@@ -0,0 +1,108 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+
6+namespace TDCGExplorer
7+{
8+ // TAH情報を抽象化する.
9+ public class GenericTahInfo
10+ {
11+ public virtual int id
12+ {
13+ get { return -1; }
14+ set { }
15+ }
16+ public virtual int zipid
17+ {
18+ get { return -1; }
19+ set { }
20+ }
21+ public virtual string path
22+ {
23+ get { return null; }
24+ set { }
25+ }
26+ public virtual string shortname
27+ {
28+ get { return null; }
29+ set { }
30+ }
31+ public virtual int version
32+ {
33+ get { return -1; }
34+ set { }
35+ }
36+ }
37+
38+ public class GenericArcsTahInfo : GenericTahInfo
39+ {
40+ private ArcsTahEntry tahEntry;
41+ public GenericArcsTahInfo(ArcsTahEntry entry)
42+ {
43+ tahEntry = entry;
44+ }
45+ public override int id
46+ {
47+ get { return tahEntry.id; }
48+ set { }
49+ }
50+ public override string path
51+ {
52+ get { return tahEntry.path; }
53+ set { }
54+ }
55+ public override string shortname
56+ {
57+ get { return tahEntry.shortname; }
58+ set { }
59+ }
60+ public override int version
61+ {
62+ get { return tahEntry.version; }
63+ set { }
64+ }
65+ }
66+/* public class GenericZipsTahInfo : GenericTahInfo
67+ {
68+ private ArcsZipTahEntry tahEntry;
69+ public GenericZipsTahInfo(ArcsZipTahEntry entry)
70+ {
71+ tahEntry = entry;
72+ }
73+ public GenericZipsTahInfo(GenericTahInfo info)
74+ {
75+ tahEntry = new ArcsZipTahEntry();
76+ tahEntry.id = info.id;
77+ tahEntry.path = info.path;
78+ tahEntry.shortname = info.shortname;
79+ tahEntry.version = info.version;
80+ tahEntry.zipid = info.zipid;
81+ }
82+ public override int id
83+ {
84+ get { return tahEntry.id; }
85+ set { }
86+ }
87+ public override int zipid
88+ {
89+ get { return tahEntry.zipid; }
90+ set { }
91+ }
92+ public override string path
93+ {
94+ get { return tahEntry.path; }
95+ set { }
96+ }
97+ public override string shortname
98+ {
99+ get { return tahEntry.shortname; }
100+ set { }
101+ }
102+ public override int version
103+ {
104+ get { return tahEntry.version; }
105+ set { }
106+ }
107+ }*/
108+}
--- TSOSorter/Source/TDCG/TDCGExplorer.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TDCGExplorer.cs (revision 3)
@@ -0,0 +1,299 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Windows.Forms;
5+using System.Threading;
6+using System.IO;
7+using System.Diagnostics;
8+using System.Drawing;
9+using System.Data.SQLite;
10+//using ArchiveLib;
11+using TDCGExplorer;
12+
13+/** TDCGExplorerオリジナルを一部オミットしている(必要なものだけ使用。
14+ * */
15+namespace TSOSorter
16+{
17+ class TDCGExplorer
18+ {
19+ private static ArcsDatabase arcsDatabase;
20+ private static SystemDatabase systemDatabase;
21+ private static FileDatabase fileDatabase;
22+ public const string CONST_DBVERSION = "1.00";
23+ public const string CONST_COPYRIGHT = "Copyright © 2014 HogePiyo/Evisen";
24+ private static string lastAccessFile = "(none)"; // 最後にアクセスしたファイル
25+ private static volatile string toolTipsMessage = "";
26+ private static volatile object lockObject = new Object();
27+
28+ public static void setup()
29+ {
30+ // カレントディレクトリを起動したディレクトリに変更
31+ Directory.SetCurrentDirectory(Application.StartupPath);
32+ // DB作成
33+ systemDatabase = new SystemDatabase();
34+ arcsDatabase = new ArcsDatabase();
35+ fileDatabase = new FileDatabase();
36+ SetToolTips(CONST_COPYRIGHT);
37+
38+ }
39+ public static void disposeData()
40+ {
41+
42+ arcsDatabase.Dispose();
43+ systemDatabase.Dispose();
44+ }
45+
46+ public static void SetToolTips(string message)
47+ {
48+ lock(lockObject){
49+ toolTipsMessage = String.Copy(message);
50+ }
51+ }
52+
53+ public static string GetToolTips()
54+ {
55+ string retval;
56+ lock (lockObject)
57+ {
58+ retval = String.Copy(toolTipsMessage);
59+ }
60+ return retval;
61+ }
62+ public static volatile int BusyCount = 0; // 他のスレッドが処理しているかのカウント
63+ public static void IncBusy()
64+ {
65+ BusyCount++;
66+ }
67+ public static void DecBusy()
68+ {
69+ BusyCount--;
70+ }
71+ public static bool BusyTest()
72+ {
73+ if (BusyCount > 0)
74+ {
75+ System.Media.SystemSounds.Exclamation.Play();
76+ return true;
77+ }
78+ return false;
79+ }
80+
81+ /** 最後にアクセスしたファイル情報
82+ * */
83+ public static string LastAccessFile
84+ {
85+ set { lastAccessFile = value; }
86+ get { return lastAccessFile; }
87+ }
88+ /**デフォルトツールファイルパス
89+ * */
90+ public static string GetAppDataPath()
91+ {
92+ return "TechArts3D\\TDCG\\TSOSorter";
93+ }
94+ public static SystemDatabase SystemDB
95+ {
96+ get { return systemDatabase; }
97+ }
98+ public static ArcsDatabase ArcsDB
99+ {
100+ get { return arcsDatabase; }
101+ }
102+ public static FileDatabase FileDB
103+ {
104+ get { return fileDatabase; }
105+ }
106+ /** arcs tree view構築
107+ * */
108+ public static void MakeArcsTreeView(TreeView tvTree)
109+ {
110+ ArcsDatabase db = ArcsDB;
111+ GenericFilesTreeNode arcs = new GenericFilesTreeNode(SystemDB.m_strArcPath);
112+ tvTree.Nodes.Add(arcs);
113+ // tahを展開する.
114+ List<ArcsTahEntry> list = db.GetTahs();
115+ foreach (ArcsTahEntry entry in list)
116+ {
117+ char[] separetor = { '\\', '/' };
118+ string[] toplevel = entry.path.Split(separetor);
119+
120+ // tahエントリを持つsubnodeを作る.
121+ if (toplevel.Length == 1)
122+ {
123+ arcs.Entries.Add(entry); // ファイルエントリを追加するだけ.
124+ }
125+ else
126+ {
127+ GenericFilesTreeNode currentNode = null;
128+ GenericFilesTreeNode parentNode = arcs;
129+ int count = 1;
130+ foreach (string sublevel in toplevel)
131+ {
132+ currentNode = null;
133+ foreach (GenericFilesTreeNode nodes in parentNode.Nodes)
134+ {
135+ if (nodes.Text == sublevel)
136+ {
137+ currentNode = nodes;
138+ break;
139+ }
140+ }
141+ if (currentNode == null)
142+ {
143+ currentNode = new GenericFilesTreeNode(sublevel);
144+ parentNode.Nodes.Add(currentNode);
145+ }
146+ parentNode = currentNode;
147+ if (++count == toplevel.Length) break; // 末端ノードの一つ前で止める.
148+ }
149+ // 末端レベルにファイル情報を格納する.
150+ currentNode.Entries.Add(entry);
151+ }
152+ }
153+ arcs.Expand();
154+ }
155+ public static void ExplorerPath(string destpath)
156+ {
157+ if (Directory.Exists(destpath) == true || File.Exists(destpath) == true)
158+ System.Diagnostics.Process.Start(@"EXPLORER.EXE", "\"" + destpath + "\"");
159+ }
160+
161+ internal static void EditSystemDatabase()
162+ {
163+ Options opt = new Options();
164+ opt.m_strTextArcPath = SystemDB.m_strArcPath;
165+ opt.m_strTextTahWorkPath = SystemDB.m_strTahWorkPath;
166+ opt.Owner = Program.MainFormWindow;
167+ if (opt.ShowDialog() == DialogResult.OK)
168+ {
169+ // 反映
170+ SystemDB.m_strArcPath = opt.m_strTextArcPath;
171+ SystemDB.m_strTahWorkPath = opt.m_strTextTahWorkPath;
172+ Program.MainFormWindow.DisplayDB();
173+
174+ }
175+ }
176+
177+ internal static void CreateNewArcsDatabase()
178+ {
179+ // 二重起動防止.
180+ CreateArcsDatabaseThread cdb = new CreateArcsDatabaseThread();
181+ Thread thread = new Thread(new ThreadStart(cdb.Run));
182+ thread.Start();
183+ }
184+ internal static void CreateNewFileDatabase()
185+ {
186+ TDCGExplorer.insertFileViews();
187+ }
188+ // データベースがビルド済みならツリーを展開する.
189+ public static void IfReadyDbDisplayArcsDB()
190+ {
191+ if (SystemDB.m_strDatabaseBuild != "")
192+ { //DisplayArcsDB(tvTree);
193+ Program.MainFormWindow.DisplayDB();
194+ TDCGExplorer.insertFileViews();
195+ }
196+ }
197+
198+ public static void insertFileViews()
199+ {
200+ try
201+ {
202+ FileDatabase filedb = TDCGExplorer.FileDB;
203+ // 選択中のパーツタイプ
204+ string strPartType = Program.MainFormWindow.getCategoryStringFromComboBoxPartsType();
205+ if (strPartType == "")
206+ {
207+ TDCGExplorer.SetToolTips("Parts type invalid");
208+ throw (new Exception());
209+ }
210+
211+ Program.MainFormWindow.FileViewer.AddFiles(filedb, strPartType);
212+ }
213+ catch (Exception e)
214+ {
215+ Debug.WriteLine(e.Message);
216+ }
217+ }
218+ }
219+
220+ public class CreateArcsDatabaseThread
221+ {
222+ public void Run()
223+ {
224+ // busyでないなら.
225+ if (TDCGExplorer.BusyCount == 0)
226+ {
227+ TDCGExplorer.IncBusy();
228+ try
229+ {
230+ string arcpath = TDCGExplorer.SystemDB.m_strArcPath;
231+// string zippath = TDCGExplorer.SystemDB.zips_path;
232+ // クローンだとかえって動作がおかしい.
233+ ArcsDatabase arcs = TDCGExplorer.ArcsDB;
234+ using (SQLiteTransaction transacion = arcs.BeginTransaction())
235+ {
236+ arcs.CreateInformationTable();
237+ arcs.CreateTahDatabase();
238+ arcs.CreateFilesDatabase();
239+ arcs.CreateZipDatabase();
240+ arcs.CreateZipTahDatabase();
241+ arcs.CreateZipTahFilesDatabase();
242+ arcs.CreateInstalledZipTable();
243+ arcs.DropIndex(); // 一旦インデックスを削除する.
244+ TDCGTAHDump.ArcsDumpDirEntriesMain(arcpath, arcs);
245+// TDCGTAHDump.ZipsDumpDirEntriesMain(zippath, arcs);
246+ // インストール済みZIPの表を作成する.
247+ TDCGExplorer.SetToolTips("Execute SQL Trsansactions");
248+ arcs.CreateIndex(); // インデックスを作成する.
249+// arcs.CreateInstalledZips();
250+ transacion.Commit();
251+
252+// if (TDCGExplorer.SystemDB.arcsvacume) arcs.Vacuum();
253+
254+// TDCGExplorer.SetToolTips("Database build complete");
255+ TDCGExplorer.SystemDB.m_strDatabaseBuild = "yes";
256+ arcs["version"] = TDCGExplorer.CONST_DBVERSION;
257+ }
258+ }
259+ catch (Exception e)
260+ {
261+ TDCGExplorer.SetToolTips("Error CreateArcsDatabaseThread : (" + TDCGExplorer.LastAccessFile + ") " + e.Message);
262+ }
263+
264+ // fileentryリストを取得
265+ List<ArcsTahEntry> arcTahEntries = TDCGExplorer.ArcsDB.GetTahs();
266+ // create file db
267+ try
268+ {
269+ FileDatabase db = TDCGExplorer.FileDB;
270+ using (SQLiteTransaction transacion = db.BeginTransaction())
271+ {
272+ db.createTables();
273+ // まず既存の情報を全部消す
274+ db.deleteAll();
275+
276+ foreach (ArcsTahEntry entry in arcTahEntries)
277+ {
278+ FileDump.FileDumpMain(entry.path, db);
279+ }
280+ transacion.Commit();
281+ TDCGExplorer.SetToolTips("Database build complete");
282+
283+ }
284+ }
285+ catch (Exception e)
286+ {
287+ TDCGExplorer.SetToolTips("Error CreateFileDatabaseThread : (" + TDCGExplorer.LastAccessFile + ") " + e.Message);
288+ TDCGExplorer.SystemDB.m_strDatabaseBuild = "";
289+ }
290+
291+
292+ TDCGExplorer.DecBusy();
293+
294+ Program.MainFormWindow.asyncDisplayFromArcs(); // 表示更新.
295+
296+ }
297+ }
298+ }
299+}
--- TSOSorter/Source/TDCG/TAHDump.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHDump.cs (revision 3)
@@ -0,0 +1,384 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Security.Cryptography;
7+using System.Text.RegularExpressions;
8+//using ArchiveLib;
9+using System.Diagnostics;
10+using System.Data.SQLite;
11+using TSOSorter;
12+
13+namespace TDCGExplorer
14+{
15+ public static class TDCGTAHDump
16+ {
17+ public static string arcspath;
18+ public static string zipspath;
19+ public static string zipcoderegexp;
20+ public static MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
21+
22+ public static void ArcsDumpDirEntriesMain(string dir, ArcsDatabase db)
23+ {
24+ arcspath = dir;
25+ if (Directory.Exists(dir) == true)
26+ {
27+ // 存在フラグを全て落とす.
28+ TSOSorter.TDCGExplorer.SetToolTips("Setup database");
29+ db.UpdateTahExistDown();
30+ ArcsDumpDirEntries(dir, db);
31+ // 存在しないtahファイルは消去する.
32+ TSOSorter.TDCGExplorer.SetToolTips("Deleting orphan records");
33+ db.DeleteNoExistentTah();
34+ }
35+ }
36+
37+ public static void ArcsDumpDirEntries(string dir, ArcsDatabase db)
38+ {
39+ bool skipflag = false;
40+ string[] shortnames = dir.Split('\\');
41+ foreach (string shortname in shortnames) if (shortname[0] == '!') skipflag = true;
42+ if (skipflag) return; // !で始まるディレクトリはスキップ
43+
44+ string[] tah_files = Directory.GetFiles(dir, "*.TAH");
45+ foreach (string file in tah_files)
46+ {
47+ // 既にdb上にエントリがあるか調べる.
48+ //string tahid = db.GetTahID(file.Substring(arcspath.Length + 1));
49+ ArcsTahEntry tah = db.GetTah(file.Substring(arcspath.Length + 1));
50+ if (tah != null)
51+ {
52+ // 日付が一致するか?
53+ DateTime datetime = File.GetLastWriteTime(file);
54+ if (tah.datetime.ToString() == datetime.ToString())
55+ {
56+ // 該当するエントリの存在フラグを立てる.
57+ TSOSorter.TDCGExplorer.SetToolTips("Update " + Path.GetFileName(file));
58+ db.UpdateTahExistUp(tah.id);
59+ continue;
60+ }
61+ else
62+ {
63+ // dbから一旦削除する.
64+ db.DeleteTah(tah.id);
65+ }
66+ }
67+ TSOSorter.TDCGExplorer.LastAccessFile = file;
68+ using (FileStream source = File.OpenRead(file))
69+ {
70+ ArcsDumpTAHEntries(source, db, file);
71+ }
72+ }
73+ string[] entries = Directory.GetDirectories(dir);
74+ foreach (string entry in entries)
75+ {
76+ ArcsDumpDirEntries(entry, db);
77+ }
78+ }
79+
80+ public static void ArcsDumpTAHEntries(Stream source, ArcsDatabase db, string tahname)
81+ {
82+ try
83+ {
84+ TSOSorter.TDCGExplorer.SetToolTips("Processing " + Path.GetFileName(tahname));
85+ using (TAHFile tah = new TAHFile(source))
86+ {
87+ try
88+ {
89+ tah.LoadEntries();
90+ }
91+ catch (Exception ex)
92+ {
93+ Debug.WriteLine("Error: " + ex);
94+ return;
95+ }
96+
97+ DateTime datetime = File.GetLastWriteTime(tahname);
98+
99+ ArcsTahEntry entry = new ArcsTahEntry();
100+ entry.path = tahname.Substring(arcspath.Length + 1);
101+ entry.shortname = Path.GetFileName(tahname).ToLower();
102+ entry.version = (int)tah.Header.Version;
103+ entry.id = 0;
104+ entry.exist = 1;
105+ entry.datetime = datetime;
106+
107+ entry.id = db.SetTahEntry(entry);
108+ ArcsDumpTahFilesEntries(db, entry, tah);
109+ }
110+ }
111+ catch (Exception ex)
112+ {
113+ Debug.WriteLine("Error: " + ex);
114+ return;
115+ }
116+ }
117+
118+ public static void ArcsDumpTahFilesEntries(ArcsDatabase db, ArcsTahEntry entry, TAHFile tah)
119+ {
120+ string source = Path.Combine(TSOSorter.TDCGExplorer.SystemDB.m_strArcPath, entry.path);
121+ int tahentry = 0;
122+ foreach (TAHEntry ent in tah.EntrySet.Entries)
123+ {
124+ if (ent.FileName == null)
125+ {
126+ TSOSorter.TDCGExplorer.SetToolTips("Dump " + ent.Hash.ToString("x8") + " file");
127+ }
128+ else
129+ {
130+ TSOSorter.TDCGExplorer.SetToolTips("Dump " + ent.FileName + " file");
131+ }
132+ ArcsTahFilesEntry fileentry = new ArcsTahFilesEntry();
133+ fileentry.id = 0;
134+ fileentry.tahid = entry.id;
135+ fileentry.tahentry = tahentry++;
136+ fileentry.path = ent.FileName;
137+ if (entry.path == null) entry.path = "";
138+ fileentry.hash = (int)ent.Hash;
139+ fileentry.length = (int)ent.Length;
140+ db.SetTahFilesPath(fileentry);
141+
142+ }
143+ }
144+
145+ /*//ファイルシステムをスキャンしてZIP情報を集める.
146+ public static void ZipsDumpDirEntriesMain(string dir, ArcsDatabase db)
147+ {
148+ zipspath = dir;
149+ if (Directory.Exists(dir) == true)
150+ {
151+ zipcoderegexp = TDCGExplorer.SystemDB.zip_regexp;
152+ // 存在フラグを全て落とす.
153+ TDCGExplorer.SetToolTips("Setup database");
154+ db.UpdateZipExistDown();
155+ ZipsDumpDirEntries(dir, db);
156+ // 存在しないtahファイルは消去する.
157+ TDCGExplorer.SetToolTips("Deleting orphan records");
158+ db.DeleteNoExistentZip();
159+ }
160+ }
161+
162+ public static void ZipsDumpDirEntries(string dir, ArcsDatabase db)
163+ {
164+ // ファイルを思わしき者は全部調べて、その中からzip,lzh,rarを抽出する.
165+ string[] zip_files = Directory.GetFiles(dir, "*.*");
166+ foreach (string file in zip_files)
167+ {
168+ //string zipid = db.GetZipID(file.Substring(zipspath.Length + 1));
169+ ArcsZipArcEntry zip = db.GetZip(file.Substring(zipspath.Length + 1));
170+ if (zip != null)
171+ {
172+ DateTime datetime = File.GetLastWriteTime(file);
173+ if (zip.datetime.ToString() == datetime.ToString())
174+ {
175+ // 該当するエントリの存在フラグを立てる.
176+ TDCGExplorer.SetToolTips("Update " + Path.GetFileName(file));
177+ db.UpdateZipExistUp(zip.id);
178+ continue;
179+ }
180+ else
181+ {
182+ db.DeleteZip(zip.id);
183+ }
184+ }
185+ ZipsDumpTAHEntries(db, file);
186+ }
187+ string[] entries = Directory.GetDirectories(dir);
188+ foreach (string entry in entries)
189+ {
190+ // 解凍済みMODを処理する.
191+ string zipname = entry.Substring(zipspath.Length + 1);
192+ ArcsZipArcEntry zip = db.GetZip(zipname);
193+ if (zip != null)
194+ {
195+ DateTime datetime = File.GetLastWriteTime(entry);
196+ if (zip.datetime.ToString() == datetime.ToString())
197+ {
198+ // 該当するエントリの存在フラグを立てる.
199+ TDCGExplorer.SetToolTips("Update " + Path.GetFileName(zip.path));
200+ db.UpdateZipExistUp(zip.id);
201+ continue;
202+ }
203+ }
204+
205+ // MOD名に一致するか調べる.
206+ char[] separetor = { '\\', '/' };
207+ string[] sublevel = zipname.Split(separetor);
208+ string directory = sublevel[sublevel.Length - 1];
209+
210+ Regex regDirectAccess = new System.Text.RegularExpressions.Regex(TDCGExplorer.SystemDB.directaccess_signature);
211+ Match m = regDirectAccess.Match(directory);
212+ if (m.Success)
213+ {
214+ Regex filter = new Regex(zipcoderegexp);
215+ Match match = filter.Match(directory);
216+ if (match.Success == true)
217+ {
218+ TDCGExplorer.SetToolTips("Processing " + directory);
219+ ArcsZipArcEntry ent = new ArcsZipArcEntry();
220+ ent.id = 0;
221+ ent.path = zipname;
222+ ent.code = match.Groups[1].ToString();
223+ ent.exist = 1;
224+ ent.datetime = File.GetLastWriteTime(entry);
225+ ent.id = db.SetZipEntry(ent);
226+ DumpArcEntries(db, entry, new DirectAccessArchive(), ent.id);
227+ continue;
228+ }
229+ }
230+
231+ // 通常のディレクトリスキャン.
232+ ZipsDumpDirEntries(entry, db);
233+ }
234+ }
235+
236+ public static void ZipsDumpTAHEntries(ArcsDatabase db, string zipname)
237+ {
238+ string ext = Path.GetExtension(zipname).ToLower();
239+ if (ext == ".zip" || ext == ".lzh" || ext == ".rar")
240+ {
241+ TDCGExplorer.SetToolTips("Processing " + Path.GetFileName(zipname));
242+ Regex filter = new Regex(zipcoderegexp);
243+ Match match = filter.Match(Path.GetFileName(zipname));
244+ if (match.Success)
245+ {
246+ DateTime datetime = File.GetLastWriteTime(zipname);
247+ ArcsZipArcEntry entry = new ArcsZipArcEntry();
248+ entry.id = 0;
249+ entry.path = zipname.Substring(zipspath.Length + 1);
250+ entry.code = match.Groups[1].ToString();
251+ entry.exist = 1;
252+ entry.datetime = datetime;
253+ entry.id = db.SetZipEntry(entry);
254+ ZipDumpArcEntries(db, entry);
255+ }
256+ else
257+ {
258+ DateTime datetime = File.GetLastWriteTime(zipname);
259+ ArcsZipArcEntry entry = new ArcsZipArcEntry();
260+ entry.id = 0;
261+ entry.path = zipname.Substring(zipspath.Length + 1);
262+ entry.code = Path.GetFileNameWithoutExtension(zipname);
263+ entry.exist = 1;
264+ entry.datetime = datetime;
265+ entry.id = db.SetZipEntry(entry);
266+ ZipDumpArcEntries(db, entry);
267+ }
268+ }
269+ }
270+
271+ public static void ZipDumpArcEntries(ArcsDatabase db, ArcsZipArcEntry entry)
272+ {
273+ string ext = Path.GetExtension(entry.path).ToLower();
274+ switch (ext)
275+ {
276+ case ".zip":
277+ using (IArchive arc = new ZipArchive())
278+ {
279+ DumpArcEntries(db, Path.Combine(TDCGExplorer.SystemDB.zips_path, entry.path), arc, entry.id);
280+ }
281+ break;
282+ case ".rar":
283+ using (IArchive arc = new RarArchive())
284+ {
285+ DumpArcEntries(db, Path.Combine(TDCGExplorer.SystemDB.zips_path, entry.path), arc, entry.id);
286+ }
287+ break;
288+ case ".lzh":
289+ using (IArchive arc = new LzhArchive())
290+ {
291+ DumpArcEntries(db, Path.Combine(TDCGExplorer.SystemDB.zips_path, entry.path), arc, entry.id);
292+ }
293+ break;
294+ default:
295+ break;
296+ }
297+ }
298+
299+ public static void DumpArcEntries(ArcsDatabase db, string source_file, IArchive arc, int id)
300+ {
301+ try
302+ {
303+ TSOSorter.TDCGExplorer.LastAccessFile = source_file;
304+ arc.Open(source_file);
305+
306+ foreach (IArchiveEntry entry in arc)
307+ {
308+ // ディレクトリのみの場合はスキップする.
309+ if (entry.IsDirectory == true) continue;
310+
311+ // TAHファイルなら詳細をダンプする.
312+ if (Path.GetExtension(entry.FileName) == ".tah")
313+ {
314+ using (MemoryStream ms = new MemoryStream((int)entry.Size))
315+ {
316+ arc.Extract(entry, ms);
317+ ms.Seek(0, SeekOrigin.Begin);
318+
319+ using (TAHFile tah = new TAHFile(ms))
320+ {
321+ try
322+ {
323+ tah.LoadEntries();
324+ }
325+ catch (Exception ex)
326+ {
327+ Debug.WriteLine("Error: " + ex);
328+ continue;
329+ }
330+
331+ ArcsZipTahEntry ziptahentry = new ArcsZipTahEntry();
332+ ziptahentry.id = 0;
333+ ziptahentry.path = entry.FileName;
334+ ziptahentry.shortname = Path.GetFileName(entry.FileName).ToLower();
335+ ziptahentry.version = (int)tah.Header.Version;
336+ ziptahentry.zipid = id;
337+ int tahid = db.SetZipTahEntry(ziptahentry);
338+
339+ int tahentry = 0;
340+ foreach (TAHEntry ent in tah.EntrySet.Entries)
341+ {
342+ if (ent.FileName == null)
343+ {
344+ TSOSorter.TDCGExplorer.SetToolTips("Dump " + ent.Hash.ToString("x8") + " file");
345+ }
346+ else
347+ {
348+ TSOSorter.TDCGExplorer.SetToolTips("Dump " + Path.GetFileName(ent.FileName) + " file");
349+ }
350+ ArcsTahFilesEntry fileentry = new ArcsTahFilesEntry();
351+ fileentry.id = 0;
352+ fileentry.tahid = tahid;
353+ fileentry.tahentry = tahentry++;
354+ fileentry.path = ent.FileName;
355+ if (fileentry.path == null) fileentry.path = "";
356+ //fileentry.md5sum = "";
357+ fileentry.hash = (int)ent.Hash;
358+ fileentry.length = (int)ent.Length;
359+ db.SetZipTahFilesPath(fileentry);
360+
361+ }
362+ }
363+ }
364+ }
365+ else
366+ {
367+ // tahファイル以外はファイル名のみ情報を格納する.
368+ ArcsZipTahEntry ziptahentry = new ArcsZipTahEntry();
369+ ziptahentry.id = 0;
370+ ziptahentry.path = entry.FileName;
371+ ziptahentry.version = 0;
372+ ziptahentry.zipid = id;
373+ int tahid = db.SetZipTahEntry(ziptahentry);
374+ }
375+ }
376+ }
377+ catch (Exception ex)
378+ {
379+ Debug.WriteLine("Error: " + ex);
380+ return;
381+ }
382+ }*/
383+ }
384+}
--- TSOSorter/Source/TDCG/TDCGTbn.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TDCGTbn.cs (revision 3)
@@ -0,0 +1,201 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using TSOSorter;
7+
8+namespace TDCGExplorer
9+{
10+ public static class TDCGTbnUtil
11+ {
12+ private static TBNCategoryData[] categoryTable;
13+
14+ static TDCGTbnUtil()
15+ {
16+ categoryTable = new TBNCategoryData[30];
17+ categoryTable[0] = new TBNCategoryData('A', TextResource.TbnCatA, 0x00, 0x04, 0x03);
18+ categoryTable[1] = new TBNCategoryData('B', TextResource.TbnCatB, 0x01, 0x09, 0x08);
19+ categoryTable[2] = new TBNCategoryData('C', TextResource.TbnCatC, 0x02, 0x0E, 0x0D);
20+ categoryTable[3] = new TBNCategoryData('D', TextResource.TbnCatD, 0x03, 0x13, 0x12);
21+ categoryTable[4] = new TBNCategoryData('E', TextResource.TbnCatE, 0x04, 0x18, 0x17);
22+ categoryTable[5] = new TBNCategoryData('F', TextResource.TbnCatF, 0x05, 0x1D, 0x1C);
23+ categoryTable[6] = new TBNCategoryData('G', TextResource.TbnCatG, 0x06, 0x22, 0x21);
24+ categoryTable[7] = new TBNCategoryData('H', TextResource.TbnCatH, 0x07, 0x27, 0x26);
25+ categoryTable[8] = new TBNCategoryData('I', TextResource.TbnCatI, 0x08, 0x2C, 0x2B);
26+ categoryTable[9] = new TBNCategoryData('J', TextResource.TbnCatJ, 0x09, 0x31, 0x30);
27+ categoryTable[10] = new TBNCategoryData('K', TextResource.TbnCatK, 0x0A, 0x36, 0x35);
28+ categoryTable[11] = new TBNCategoryData('L', TextResource.TbnCatL, 0x0B, 0x3B, 0x3A);
29+ categoryTable[12] = new TBNCategoryData('M', TextResource.TbnCatM, 0x0C, 0x40, 0x3F);
30+ categoryTable[13] = new TBNCategoryData('N', TextResource.TbnCatN, 0x0D, 0x45, 0x44);
31+ categoryTable[14] = new TBNCategoryData('O', TextResource.TbnCatO, 0x0E, 0x4A, 0x49);
32+ categoryTable[15] = new TBNCategoryData('P', TextResource.TbnCatP, 0x0F, 0x4F, 0x4E);
33+ categoryTable[16] = new TBNCategoryData('Q', TextResource.TbnCatQ, 0x10, 0x54, 0x53);
34+ categoryTable[17] = new TBNCategoryData('R', TextResource.TbnCatR, 0x11, 0x59, 0x58);
35+ categoryTable[18] = new TBNCategoryData('S', TextResource.TbnCatS, 0x12, 0x5E, 0x5D);
36+ categoryTable[19] = new TBNCategoryData('T', TextResource.TbnCatT, 0x13, 0x63, 0x62);
37+ categoryTable[20] = new TBNCategoryData('U', TextResource.TbnCatU, 0x14, 0x68, 0x67);
38+ categoryTable[21] = new TBNCategoryData('V', TextResource.TbnCatV, 0x15, 0x6D, 0x6C);
39+ categoryTable[22] = new TBNCategoryData('W', TextResource.TbnCatW, 0x16, 0x72, 0x71);
40+ categoryTable[23] = new TBNCategoryData('X', TextResource.TbnCatX, 0x17, 0x77, 0x76);
41+ categoryTable[24] = new TBNCategoryData('Y', TextResource.TbnCatY, 0x18, 0x7C, 0x7B);
42+ categoryTable[25] = new TBNCategoryData('Z', TextResource.TbnCatZ, 0x19, 0x00, 0x00);
43+ categoryTable[26] = new TBNCategoryData('0', TextResource.TbnCat0, 0x1A, 0x86, 0x85);
44+ categoryTable[27] = new TBNCategoryData('1', TextResource.TbnCat1, 0x1B, 0x8B, 0x8A);
45+ categoryTable[28] = new TBNCategoryData('2', TextResource.TbnCat2, 0x1C, 0x90, 0x8F);
46+ categoryTable[29] = new TBNCategoryData('3', TextResource.TbnCat3, 0x1D, 0x95, 0x94);
47+ }
48+
49+ public static TBNCategoryData[] CategoryData
50+ {
51+ get { return categoryTable; }
52+ }
53+
54+ public static string GetCategoryText(string pathname)
55+ {
56+ string file = Path.GetFileNameWithoutExtension(pathname);
57+ string ext = Path.GetExtension(pathname).ToLower();
58+ if (file.Length != 12) return "";
59+ if (ext == ".psd" || ext == ".tbn" || ext == ".tso")
60+ {
61+ string typechar = file.Substring(9, 1);
62+ int type = typechartotype(typechar[0]);
63+ return CategoryData[type].name;
64+ }
65+ return "";
66+ }
67+
68+ public static int typechartotype(char typecode)
69+ {
70+ int type = 0;
71+ string typestring = new string(typecode, 1);
72+ switch (typestring.ToUpper())
73+ {
74+ case "A": type = 0; break;
75+ case "B": type = 1; break;
76+ case "C": type = 2; break;
77+ case "D": type = 3; break;
78+ case "E": type = 4; break;
79+ case "F": type = 5; break;
80+ case "G": type = 6; break;
81+ case "H": type = 7; break;
82+ case "I": type = 8; break;
83+ case "J": type = 9; break;
84+ case "K": type = 10; break;
85+ case "L": type = 11; break;
86+ case "M": type = 12; break;
87+ case "N": type = 13; break;
88+ case "O": type = 14; break;
89+ case "P": type = 15; break;
90+ case "Q": type = 16; break;
91+ case "R": type = 17; break;
92+ case "S": type = 18; break;
93+ case "T": type = 19; break;
94+ case "U": type = 20; break;
95+ case "V": type = 21; break;
96+ case "W": type = 22; break;
97+ case "X": type = 23; break;
98+ case "Y": type = 24; break;
99+ case "Z": type = 25; break;
100+ case "0": type = 26; break;
101+ case "1": type = 27; break;
102+ case "2": type = 28; break;
103+ case "3": type = 29; break;
104+ }
105+ return type;
106+ }
107+
108+
109+ public static void SetTsoName(byte[] tbndata, string tsoname)
110+ {
111+ int offset = -1;
112+ switch (tbndata.Length)
113+ {
114+ case 6040:
115+ offset = 0x177c;
116+ break;
117+ case 8884:
118+ offset = 0x2298;
119+ break;
120+ case 8904:
121+ offset = 0x22ac;
122+ break;
123+ case 8980:
124+ offset = 0x22e8;
125+ break;
126+ }
127+ if (offset == -1) return;
128+ int index = 0;
129+ foreach (char code in tsoname)
130+ {
131+ tbndata[offset + index] = (byte)code;
132+ index++;
133+ }
134+ tbndata[offset + index] = 0;
135+ }
136+ public static string GetTsoName(byte[] tbndata)
137+ {
138+ int offset = -1;
139+ switch (tbndata.Length)
140+ {
141+ case 6040:
142+ offset = 0x177c;
143+ break;
144+ case 8884:
145+ offset = 0x2298;
146+ break;
147+ case 8904:
148+ offset = 0x22ac;
149+ break;
150+ case 8980:
151+ offset = 0x22e8;
152+ break;
153+ }
154+ if (offset == -1) return null;
155+ string tsoname = "";
156+ for (int index = 0; tbndata[offset + index] != 0; index++)
157+ {
158+ tsoname += (char)tbndata[offset + index];
159+ }
160+ return tsoname;
161+ }
162+ public static void SetTsoSignature(byte[] tbndata, TBNCategoryData category)
163+ {
164+ if (category.byte1 != 0x1a)
165+ {
166+ tbndata[0x6f0] = category.byte1;
167+ tbndata[0x73a] = category.byte2;
168+ tbndata[0x756] = category.byte3;
169+ }
170+ }
171+ public static string ext(byte[] data)
172+ {
173+ if (data.Length > 4 && data[0] == 'F' && data[1] == 'O' && data[2] == 'N' && data[3] == 'T') return ".font";
174+ if (data.Length > 4 && data[0] == '8' && data[1] == 'B' && data[2] == 'P' && data[3] == 'S') return ".psd";
175+ if (data.Length > 4 && data[0] == 0x89 && data[1] == 'P' && data[2] == 'N' && data[3] == 'G') return ".png";
176+ if (data.Length > 4 && data[0] == 'T' && data[1] == 'S' && data[2] == 'O' && data[3] == '1') return ".tso";
177+ if (data.Length > 4 && data[0] == 'T' && data[1] == 'M' && data[2] == 'O' && data[3] == '1') return ".tmo";
178+ if (data.Length > 4 && data[0] == '/' && data[1] == '*' && data[2] == '*' && data[3] == '*') return ".cgfx";
179+ if (data.Length > 4 && data[0] == 'B' && data[1] == 'B' && data[2] == 'B' && data[3] == 'B') return ".tbn";
180+ if (data.Length > 4 && data[0] == 'O' && data[1] == 'g' && data[2] == 'g' && data[3] == 'S') return ".ogg";
181+ return "";
182+ }
183+ }
184+
185+ public class TBNCategoryData
186+ {
187+ public char symbol;
188+ public string name;
189+ public byte byte1;
190+ public byte byte2;
191+ public byte byte3;
192+ public TBNCategoryData(char sym, string nam, byte b1, byte b2, byte b3)
193+ {
194+ symbol = sym;
195+ name = nam;
196+ byte1 = b1;
197+ byte2 = b2;
198+ byte3 = b3;
199+ }
200+ }
201+}
--- TSOSorter/Source/TDCG/PSDFile.cs (nonexistent)
+++ TSOSorter/Source/TDCG/PSDFile.cs (revision 3)
@@ -0,0 +1,127 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Drawing;
4+using System.Drawing.Imaging;
5+using System.IO;
6+using System.Text;
7+using System.Runtime.InteropServices;
8+
9+namespace TDCGExplorer
10+{
11+ using DWORD = UInt32;
12+ using LONG = Int32;
13+ using WORD = UInt16;
14+
15+ public struct BITMAPINFOHEADER
16+ {
17+ public DWORD biSize;
18+ public LONG biWidth;
19+ public LONG biHeight;
20+ public WORD biPlanes;
21+ public WORD biBitCount;
22+ public DWORD biCompression;
23+ public DWORD biSizeImage;
24+ public LONG biXPelsPerMeter;
25+ public LONG biYPelsPerMeter;
26+ public DWORD biClrUsed;
27+ public DWORD biClrImportant;
28+ };
29+
30+ public unsafe class PSDFile : IDisposable
31+ {
32+ public Bitmap Bitmap { get { return bmp; } }
33+ Bitmap bmp = null;
34+
35+ public void Load(string source_file)
36+ {
37+ using (Stream source_stream = File.OpenRead(source_file))
38+ Load(source_stream);
39+ }
40+
41+ public void Load(Stream fs)
42+ {
43+ byte[] buf = new byte[fs.Length];
44+ fs.Read(buf, 0, buf.Length);
45+
46+ IntPtr pHBInfo = IntPtr.Zero;
47+ IntPtr pHBm = IntPtr.Zero;
48+
49+ fixed (byte* p = &buf[0])
50+ {
51+ int rc = GetPicture(p, buf.Length, 1, out pHBInfo, out pHBm, null, 0);
52+
53+ if (rc != 0)
54+ return;
55+
56+ BITMAPINFOHEADER* pInfo = (BITMAPINFOHEADER*)LocalLock(pHBInfo);
57+ byte* pBM = (byte*)LocalLock(pHBm);
58+ int s = 0;
59+ Rectangle r = new Rectangle(0, 0, pInfo->biWidth, pInfo->biHeight);
60+ bmp = new Bitmap(pInfo->biWidth, pInfo->biHeight, PixelFormat.Format24bppRgb);
61+ BitmapData data = bmp.LockBits(r, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
62+ byte* dst = (byte*)data.Scan0;
63+ dst += data.Stride * data.Height;
64+
65+ switch (pInfo->biBitCount)
66+ {
67+ case 8: break;
68+ case 16: break;
69+ case 24:
70+ for (uint y = 0; y < pInfo->biHeight; ++y)
71+ {
72+ dst -= data.Stride;
73+
74+ for (uint x = 0; x < pInfo->biWidth; ++x)
75+ {
76+ dst[x * 3 + 0] = pBM[s++];
77+ dst[x * 3 + 1] = pBM[s++];
78+ dst[x * 3 + 2] = pBM[s++];
79+ }
80+ }
81+ break;
82+
83+ case 32:
84+ for (uint y = 0; y < pInfo->biHeight; ++y)
85+ {
86+ dst -= data.Stride;
87+
88+ for (uint x = 0; x < pInfo->biWidth; ++x)
89+ {
90+ dst[x * 3 + 0] = pBM[s++];
91+ dst[x * 3 + 1] = pBM[s++];
92+ dst[x * 3 + 2] = pBM[s++];
93+ ++s;
94+ }
95+ }
96+ break;
97+ }
98+
99+ bmp.UnlockBits(data);
100+
101+ LocalUnlock(pHBInfo);
102+ LocalUnlock(pHBm);
103+ }
104+ }
105+
106+ public void Dispose()
107+ {
108+ if (bmp != null)
109+ {
110+ bmp.Dispose();
111+ bmp = null;
112+ }
113+ }
114+
115+ [DllImport("kernel32.dll")]
116+ public extern static void* LocalLock(IntPtr handle);
117+
118+ [DllImport("kernel32.dll")]
119+ public extern static int LocalUnlock(IntPtr handle);
120+
121+ [DllImport("iftpsd.sph")]
122+ public extern static int GetPicture(byte* file, int len, uint flag, out IntPtr pHBInfo, out IntPtr pHBm, void* lpPrgressCallback, uint lData);
123+
124+ //[DllImport("axpsd.spi")]
125+ //public extern static int GetPicture(string file, int len, uint flag, out IntPtr pHBInfo, out IntPtr pHBm, void* lpPrgressCallback, uint lData);
126+ }
127+}
--- TSOSorter/Source/TDCG/TAHStream.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHStream.cs (revision 3)
@@ -0,0 +1,154 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Windows.Forms;
7+using TSOSorter;
8+
9+namespace TDCGExplorer
10+{
11+ public class GenericTAHStream : IDisposable
12+ {
13+// private IArchive archive = null;
14+ private MemoryStream ms = null;
15+ private TAHFile tah = null;
16+ private MemoryStream ims = null;
17+
18+ public GenericTAHStream(GenericTahInfo info, ArcsTahFilesEntry tsoInfo)
19+ {
20+/* // zipファイルの中か?
21+ if (info.zipid != -1)
22+ {
23+ ArcsZipArcEntry zip = TDCGExplorer.ArcsDB.GetZip(info.zipid);
24+ string zippath = Path.Combine(TDCGExplorer.SystemDB.zips_path, zip.path);
25+ switch (Path.GetExtension(zip.path).ToLower())
26+ {
27+ case ".zip":
28+ archive = new ZipArchive();
29+ break;
30+ case ".lzh":
31+ archive = new LzhArchive();
32+ break;
33+ case ".rar":
34+ archive = new RarArchive();
35+ break;
36+ default:
37+ archive = new DirectAccessArchive();
38+ break;
39+
40+ }
41+ TDCGExplorer.LastAccessFile = zippath;
42+ archive.Open(zippath);
43+ if (archive == null)
44+ {
45+ throw new Exception(TextResource.ArchiveIsNull);
46+ }
47+
48+ //
49+ foreach (IArchiveEntry entry in archive)
50+ {
51+ // ディレクトリのみの場合はスキップする.
52+ if (entry.IsDirectory == true) continue;
53+ // マッチするファイルを見つけた.
54+ if (entry.FileName == info.path)
55+ {
56+ ms = new MemoryStream((int)entry.Size);
57+
58+ archive.Extract(entry, ms);
59+ ms.Seek(0, SeekOrigin.Begin);
60+ tah = new TAHFile(ms);
61+ tah.LoadEntries();
62+ if (tsoInfo == null) return;
63+ int tahentry = 0;
64+ foreach (TAHEntry ent in tah.EntrySet.Entries)
65+ {
66+ // 該当ファイルを見つけた.
67+ if (tahentry == tsoInfo.tahentry)
68+ {
69+ byte[] data = TAHUtil.ReadEntryData(tah.Reader, ent);
70+ //
71+ Cursor.Current = Cursors.WaitCursor;
72+ ims = new MemoryStream(data);
73+ return;
74+ }
75+ tahentry++;
76+ }
77+ }
78+ }
79+ }
80+ else*/
81+ {
82+ string source = Path.Combine(TSOSorter.TDCGExplorer.SystemDB.m_strArcPath, info.path);
83+ tah = new TAHFile(source);
84+ tah.LoadEntries();
85+ if (tsoInfo == null) return;
86+ int tahentry = 0;
87+ foreach (TAHEntry ent in tah.EntrySet.Entries)
88+ {
89+ // 該当ファイルを見つけた.
90+ if (tahentry == tsoInfo.tahentry)
91+ {
92+ byte[] data = TAHUtil.ReadEntryData(tah.Reader, ent);
93+ //
94+ ims = new MemoryStream(data);
95+ return;
96+ }
97+ tahentry++;
98+ }
99+ }
100+ throw new Exception("TAH内のファイルが見つかりません");
101+ }
102+
103+ public Stream stream
104+ {
105+ get
106+ {
107+ if (ims == null)
108+ {
109+ throw new Exception("TAHStreamは初期化されませんでした");
110+ }
111+ return ims;
112+ }
113+ set { }
114+ }
115+
116+ public TAHFile tahfile
117+ {
118+ get
119+ {
120+ if (this.tah == null)
121+ {
122+ throw new Exception("TAHStreamは初期化されませんでした");
123+ }
124+ return tah;
125+ }
126+ set { }
127+ }
128+
129+ // 確実に開放する.
130+ public void Dispose()
131+ {
132+ if (ims != null)
133+ {
134+ ims.Dispose();
135+ ims = null;
136+ }
137+ if (tah != null)
138+ {
139+ tah.Dispose();
140+ tah = null;
141+ }
142+ if (ms != null)
143+ {
144+ ms.Dispose();
145+ ms = null;
146+ }
147+/* if (archive != null)
148+ {
149+ archive.Dispose();
150+ archive = null;
151+ }*/
152+ }
153+ }
154+}
--- TSOSorter/Source/TDCG/TAHCryptStream.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHCryptStream.cs (revision 3)
@@ -0,0 +1,94 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+
7+namespace TDCGExplorer
8+{
9+ public class TAHCryptStream : Stream
10+ {
11+ private const int MASK = 1023;
12+ private byte[] key = new byte[MASK + 1];
13+ private Stream basestream;
14+ private int seed;
15+
16+ public TAHCryptStream(Stream basestream, int length)
17+ {
18+ this.basestream = basestream;
19+ uint[] init_key = new uint[4]
20+ {
21+ ((uint)length | 0x80) >> 5,
22+ ((uint)length << 9) | 0x06,
23+ ((uint)length << 6) | 0x04,
24+ ((uint)length | 0x48) >> 3,
25+ };
26+
27+ mt19937.init_by_array(init_key, 4);
28+
29+ for (int i = 0; i < 1024; ++i)
30+ {
31+ key[i] = (byte)((mt19937.genrand_int32()) >> (int)(i % 7));
32+ //DbgPrint(key[i].ToString("X").PadLeft(2, '0'));
33+ }
34+
35+ seed = (((length / 1000) % 10)
36+ + ((length / 100) % 10)
37+ + ((length / 10) % 10)
38+ + ((length) % 10)) & 0x31A;
39+ ++seed;
40+ }
41+
42+ public override bool CanRead { get { return basestream.CanRead; } }
43+ public override bool CanSeek { get { return basestream.CanSeek; } }
44+ public override bool CanWrite { get { return basestream.CanWrite; } }
45+ public override long Length { get { return basestream.Length; } }
46+ public override long Position
47+ {
48+ get { return basestream.Position; }
49+ set { basestream.Position = value; }
50+ }
51+
52+ public override void Flush() { basestream.Flush(); }
53+
54+ public override long Seek(long offset, SeekOrigin origin)
55+ {
56+ return basestream.Seek(offset, origin);
57+ }
58+
59+ public override void SetLength(long value)
60+ {
61+ basestream.SetLength(value);
62+ }
63+
64+ public override int Read(byte[] buffer, int offset, int count)
65+ {
66+ if (Position >= Length)
67+ return 0;
68+
69+ long pos = Position;
70+ count = basestream.Read(buffer, offset, count);
71+ Crypt(buffer, offset, count, pos);
72+ return count;
73+ }
74+
75+ public override void Write(byte[] buffer, int offset, int count)
76+ {
77+ long pos = Position;
78+ Crypt(buffer, offset, count, pos);
79+ basestream.Write(buffer, offset, count);
80+ Crypt(buffer, offset, count, pos);
81+ }
82+
83+ public void Crypt(byte[] buffer, int offset, int count, long origin)
84+ {
85+ int kp = (int)((origin + seed) & MASK);
86+
87+ for (int i = 0; i < count; ++i)
88+ {
89+ buffer[offset + i] ^= key[kp];
90+ kp = (kp + 1) & MASK;
91+ }
92+ }
93+ }
94+}
--- TSOSorter/Source/TDCG/TAHUtil.cs (nonexistent)
+++ TSOSorter/Source/TDCG/TAHUtil.cs (revision 3)
@@ -0,0 +1,257 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+
7+namespace TDCGExplorer
8+{
9+ public class TAHUtil
10+ {
11+ //private static bool debug = true;
12+ public static bool debug = false;
13+
14+ public static UInt32 CalcHash(string s)
15+ {
16+ UInt32 key = 0xC8A4E57AU;
17+
18+ byte[] buf = Encoding.Default.GetBytes(s.ToLower());
19+
20+ foreach (byte i in buf)
21+ {
22+ key = key << 19 | key >> 13;
23+ key = key ^ (uint)i;
24+ }
25+
26+ return (uint)(key ^ (((buf[buf.Length - 1] & 0x1A) != 0x00 ? -1 : 0)));
27+ }
28+
29+ public static void WriteString(BinaryWriter bw, string s)
30+ {
31+ byte[] b = Encoding.Default.GetBytes(s);
32+ bw.Write(b, 0, b.Length);
33+ bw.Write((byte)0);
34+ }
35+
36+ public static string ReadString(BinaryReader br)
37+ {
38+ List<byte> buf = new List<byte>(200);
39+ byte b;
40+
41+ while ((b = br.ReadByte()) != 0)
42+ buf.Add(b);
43+
44+ return Encoding.Default.GetString(buf.ToArray());
45+ }
46+
47+ public static string ReadString(byte[] buf, int offset)
48+ {
49+ int begin = offset;
50+
51+ for (; offset < buf.Length; ++offset)
52+ if (buf[offset] == 0)
53+ break;
54+
55+ return Encoding.Default.GetString(buf, begin, offset - begin);
56+ }
57+
58+ public static byte[] ReadEntryData(BinaryReader br, TAHEntry e)
59+ {
60+ br.BaseStream.Seek(e.DataOffset, SeekOrigin.Begin);
61+ byte[] output = new byte[br.ReadInt32()];
62+ byte[] input = br.ReadBytes(e.Length - 4);
63+
64+ TAHUtil.Decrypt(input, output);
65+
66+ return output;
67+ }
68+
69+ public static byte[] ReadRawEntryData(BinaryReader br, TAHEntry e, out uint len)
70+ {
71+ br.BaseStream.Seek(e.DataOffset, SeekOrigin.Begin);
72+ len = br.ReadUInt32();
73+ return br.ReadBytes(e.Length - 4);
74+ }
75+
76+ public static byte[] DoDecrypt(byte[] input, byte[] output)
77+ {
78+ TAHCryptStream s = new TAHCryptStream(new MemoryStream(input, false), output.Length);
79+ LZSSInflate lzss = new LZSSInflate(new MemoryStream(output, true));
80+ lzss.Inflate(s);
81+
82+ if (lzss.InflatedSize != output.Length)
83+ throw new InvalidDataException();
84+
85+ return output;
86+ }
87+
88+ public static byte[] DoEncrypt(byte[] input)
89+ {
90+ MemoryStream ms = new MemoryStream();
91+ TAHCryptStream s = new TAHCryptStream(ms, input.Length);
92+ LZSSDeflate lzss = new LZSSDeflate(s);
93+ lzss.Deflate(input);
94+
95+ return ms.ToArray();
96+ }
97+
98+ public static byte[] Encrypt(byte[] input)
99+ {
100+ return DoEncrypt(input);
101+ }
102+
103+ public static byte[] Decrypt(byte[] input, byte[] output)
104+ {
105+ //debug = true;
106+
107+ try
108+ {
109+#if DECRYPT_DEBUG
110+ byte[] output2= new byte[output.Length];
111+
112+ if(debug)
113+ TAHUtil.DecryptOld(input.Clone() as byte[], output2);
114+#endif
115+ DoDecrypt(input, output);
116+#if DECRYPT_DEBUG
117+ if(debug)
118+ for(int i= 0; i < output.Length; ++i)
119+ System.Diagnostics.Debug.Assert(output2[i] == output[i]);
120+#endif
121+#if ENCRYPT_DEBUG
122+ byte[] encrypted = DoEncrypt(output);
123+ byte[] encrypted2 = new byte[output.Length];
124+ uint length = (uint)encrypted2.Length;
125+ //TAHdecrypt.Decrypter.encrypt(ref output, (uint)output.Length, ref encrypted2, ref length);
126+ byte[] decrypted = new byte[output.Length];
127+ DoDecrypt(encrypted, decrypted);
128+ if(debug)
129+ for(int i= 0; i < output.Length; ++i)
130+ System.Diagnostics.Debug.Assert(decrypted[i] == output[i]);
131+#endif
132+ return output;
133+ }
134+ catch (Exception e)
135+ {
136+ DbgPrint(e.ToString());
137+ throw;
138+ }
139+ }
140+#if false
141+ public static void DecryptOld(byte[] input, byte[] output)
142+ {
143+ //const UInt32 win_size = 4096;
144+ const int win_mask = 4095;
145+ int pos_win = 0xff0;
146+ int pos_out = 0;
147+ int pos_in = 0;
148+ byte[] win = new byte[4096];
149+ ushort flag = 0;
150+ uint[] init_key = new uint[4];
151+ byte[] rnd = new byte[1024];
152+
153+ init_key[0] = ((uint)output.Length | 0x80) >> 5;
154+ init_key[1] = ((uint)output.Length << 9) | 0x06;
155+ init_key[2] = ((uint)output.Length << 6) | 0x04;
156+ init_key[3] = ((uint)output.Length | 0x48) >> 3;
157+
158+ mt19937.init_by_array(init_key, 4);
159+
160+ for (int i = 0; i < 1024; ++i)
161+ {
162+ rnd[i] = (byte)((mt19937.genrand_int32()) >> (int)(i % 7));
163+
164+ if (debug)
165+ DbgPrint(rnd[i].ToString("X").PadLeft(2, '0'));
166+ }
167+
168+ int seed = (((output.Length / 1000) % 10)
169+ + ((output.Length / 100) % 10)
170+ + ((output.Length / 10) % 10)
171+ + ((output.Length) % 10)) & 0x31A;
172+ ++seed;
173+
174+ if (debug)
175+ DbgPrint("seed: " + seed.ToString("X").PadLeft(8, '0'));
176+
177+ for (int i = 0; i < input.Length; ++i)
178+ {
179+ //byte before = input[i];
180+ input[i] = (byte)(input[i] ^ rnd[seed + i & 1023]);
181+
182+ //if(debug)
183+ //{
184+ // DbgPrint(before .ToString("X").PadLeft(2, '0')
185+ // +">"+input[i].ToString("X").PadLeft(2, '0'));
186+ //}
187+ }
188+
189+ try
190+ {
191+ win.Initialize();
192+
193+ while (pos_out < output.Length)
194+ {
195+ flag >>= 1;
196+
197+ if ((flag & 0x0100) == 0)
198+ {
199+ flag = (ushort)(input[pos_in++] | 0xff00);
200+
201+ //if(debug)
202+ // DbgPrint("GetFlag: " + flag.ToString("X").PadLeft(4, '0'));
203+ }
204+
205+ if ((flag & 1) != 0)
206+ {
207+ if (debug)
208+ DbgPrint("Literal:" + input[pos_in].ToString("X").PadLeft(2, '0'));
209+
210+ output[pos_out++] =
211+ win[pos_win++] = input[pos_in++];
212+ pos_win &= win_mask;
213+ continue;
214+ }
215+
216+ int offset = input[pos_in++];
217+ int length = input[pos_in++];
218+ offset |= (length & 0xf0) << 4;
219+ length = (length & 0x0f) + 3;
220+
221+ if (debug)
222+ {
223+ DbgPrint("Match: offset=" + ((offset + 16) & 4095) + ", length=" + length);
224+ DbgPrint("Position: " + pos_out);
225+ }
226+
227+ for (int i = 0; i < length; ++i)
228+ {
229+ if (debug)
230+ System.Diagnostics.Debug.Write(" " + win[(offset + i) & win_mask].ToString("X").PadLeft(2, '0'));
231+
232+ output[pos_out++] =
233+ win[pos_win++] = win[(offset + i) & win_mask];
234+ pos_win &= win_mask;
235+
236+ if (pos_out >= output.Length)
237+ return;
238+ }
239+
240+ if (debug)
241+ System.Diagnostics.Debug.WriteLine("");
242+ }
243+ }
244+ finally
245+ {
246+ for (int i = 0; i < input.Length; ++i)
247+ input[i] = (byte)(input[i] ^ rnd[seed + i & 1023]);
248+ }
249+ }
250+#endif
251+ [System.Diagnostics.Conditional("DECRYPT_DEBUG")]
252+ public static void DbgPrint(string s)
253+ {
254+ System.Diagnostics.Debug.WriteLine(s);
255+ }
256+ }
257+}
--- TSOSorter/Source/ArcsDataBase.cs (nonexistent)
+++ TSOSorter/Source/ArcsDataBase.cs (revision 3)
@@ -0,0 +1,1455 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Data.SQLite;
7+using System.Diagnostics;
8+using TSOSorter;
9+
10+/** TSOSorterで不要な処理はオミット
11+ * 名前空間も一部改変
12+ * */
13+
14+namespace TDCGExplorer
15+{
16+ public class ArcsTahEntry
17+ {
18+ public int id;
19+ public string path;
20+ public string shortname;
21+ public int exist;
22+ public int version;
23+ public DateTime datetime;
24+ public int disable;
25+ }
26+ public class ArcsTahFilesEntry
27+ {
28+ public int id;
29+ public int tahid;
30+ public int tahentry;
31+ public string path;
32+ public int hash;
33+ public int length;
34+
35+ public string GetDisplayPath()
36+ {
37+ if (path == "")
38+ {
39+ return tahentry.ToString("d8") + "_" + hash.ToString("x8");
40+ }
41+ else
42+ {
43+ return path;
44+ }
45+ }
46+ }
47+/* public class ArcsZipArcEntry
48+ {
49+ public int id;
50+ public string path;
51+ public string code;
52+ public int exist;
53+ public DateTime datetime;
54+
55+ public string GetDisplayPath()
56+ {
57+ // アノテーションが入力されているならそれを表示する.
58+ if (TDCGExplorer.AnnDB.annotation.ContainsKey(code) == true)
59+ {
60+ return TDCGExplorer.AnnDB.annotation[code];
61+ }
62+ // リネームされていない場合で.
63+ if (Path.GetFileNameWithoutExtension(path) == code)
64+ {
65+ // arcsnamesに登録がある場合
66+ if (TDCGExplorer.Arcsnames.ContainsKey(code) == true)
67+ {
68+ ArcsNamesEntry arc = TDCGExplorer.Arcsnames[code];
69+ return arc.code + " " + arc.summary + " <" + arc.origname + ":" + arc.location + ">";
70+ }
71+ }
72+ // そうでなければ元のファイル名を返す.
73+ return Path.GetFileName(path);
74+ }
75+ }
76+ public class ArcsZipTahEntry
77+ {
78+ public int id;
79+ public int zipid;
80+ public string path;
81+ public string shortname;
82+ public int version;
83+ }*/
84+ public class ArcsCollisionRecord
85+ {
86+ public int fromTahID;
87+ public int toTahID;
88+ public int fromFilesID;
89+ public int toFilesID;
90+ }
91+ public class ArcsDatabase : IDisposable
92+ {
93+ private SQLiteConnection cnn;
94+
95+ public string GetArcsDatabasePath()
96+ {
97+ return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), TSOSorter.TDCGExplorer.GetAppDataPath());
98+ }
99+
100+ public string GetArcsDatabaseName()
101+ {
102+ return Path.Combine(GetArcsDatabasePath(), "arcs.db");
103+ }
104+
105+ public ArcsDatabase()
106+ {
107+ Directory.CreateDirectory(GetArcsDatabasePath());
108+ cnn = new SQLiteConnection("Data Source=" + GetArcsDatabaseName());
109+ cnn.Open();
110+ }
111+
112+ public SQLiteConnection MakeClone()
113+ {
114+ return (SQLiteConnection)cnn.Clone();
115+ }
116+
117+ public ArcsDatabase(ArcsDatabase cloneFrom)
118+ {
119+ cnn = cloneFrom.MakeClone();
120+ }
121+
122+ public void Dispose()
123+ {
124+ if (cnn != null)
125+ {
126+ cnn.Close();
127+ cnn.Dispose();
128+ cnn = null;
129+ }
130+ }
131+ //TAHテーブル
132+ public void CreateTahDatabase()
133+ {
134+ try
135+ {
136+ using (SQLiteCommand cmd = cnn.CreateCommand())
137+ {
138+ cmd.CommandText = "CREATE TABLE TahEntry (ID INTEGER PRIMARY KEY, PATH TEXT,SHORTNAME TEXT, EXIST INTEGER, TAHVERSION INTEGER,DATETIME TEXT)";
139+ cmd.ExecuteNonQuery();
140+ }
141+ }
142+ catch (Exception e)
143+ {
144+ Debug.WriteLine(e.Message);
145+ }
146+ }
147+ //ファイルテーブル
148+ public void CreateFilesDatabase()
149+ {
150+ try
151+ {
152+ using (SQLiteCommand cmd = cnn.CreateCommand())
153+ {
154+ cmd.CommandText = "CREATE TABLE FilesEntry (ID INTEGER PRIMARY KEY, TAHID INTEGER, TAHENTRY INTEGER, PATH TEXT, HASH INTEGER,LENGTH INTEGER)";
155+ cmd.ExecuteNonQuery();
156+ }
157+ }
158+ catch (Exception e)
159+ {
160+ Debug.WriteLine(e.Message);
161+ }
162+ }
163+ // ZIPテーブル
164+ public void CreateZipDatabase()
165+ {
166+ try
167+ {
168+ using (SQLiteCommand cmd = cnn.CreateCommand())
169+ {
170+ cmd.CommandText = "CREATE TABLE ZipEntry (ID INTEGER PRIMARY KEY, PATH TEXT, CODE TEXT,EXIST INTEGER,DATETIME TEXT)";
171+ cmd.ExecuteNonQuery();
172+ }
173+ }
174+ catch (Exception e)
175+ {
176+ Debug.WriteLine(e.Message);
177+ }
178+ }
179+ //インストール済みzipテーブル.
180+ public void CreateInstalledZipTable()
181+ {
182+ try
183+ {
184+ using (SQLiteCommand cmd = cnn.CreateCommand())
185+ {
186+ cmd.CommandText = "CREATE TABLE InstalledZipEntry (ID INTEGER PRIMARY KEY, ZIPID INTEGER)";
187+ cmd.ExecuteNonQuery();
188+ }
189+ }
190+ catch (Exception e)
191+ {
192+ Debug.WriteLine(e.Message);
193+ }
194+ }
195+
196+ //ZIP中のTAHテーブル
197+ public void CreateZipTahDatabase()
198+ {
199+ try
200+ {
201+ using (SQLiteCommand cmd = cnn.CreateCommand())
202+ {
203+ cmd.CommandText = "CREATE TABLE ZipTahEntry (ID INTEGER PRIMARY KEY, PATH TEXT,SHORTNAME TEXT, TAHVERSION INTEGER,ZIPID INTEGER)";
204+ cmd.ExecuteNonQuery();
205+ }
206+ }
207+ catch (Exception e)
208+ {
209+ Debug.WriteLine(e.Message);
210+ }
211+ }
212+ //ZIP中のTAHファイルテーブル
213+ public void CreateZipTahFilesDatabase()
214+ {
215+ try
216+ {
217+ using (SQLiteCommand cmd = cnn.CreateCommand())
218+ {
219+ cmd.CommandText = "CREATE TABLE ZipTahFilesEntry (ID INTEGER PRIMARY KEY, TAHID INTEGER, TAHENTRY INTEGER, PATH TEXT, HASH INTEGER,LENGTH INTEGER)";
220+ cmd.ExecuteNonQuery();
221+ }
222+ }
223+ catch (Exception e)
224+ {
225+ Debug.WriteLine(e.Message);
226+ }
227+ }
228+
229+ public void CreateInformationTable()
230+ {
231+ try
232+ {
233+ using (SQLiteCommand cmd = cnn.CreateCommand())
234+ {
235+ cmd.CommandText = "CREATE TABLE Information (ID TEXT PRIMARY KEY, VALUE TEXT)";
236+ cmd.ExecuteNonQuery();
237+ }
238+ }
239+ catch (Exception e)
240+ {
241+ Debug.WriteLine(e.Message);
242+ }
243+ }
244+
245+ // 値を読み出す.
246+ private string GetInformationValue(string id)
247+ {
248+ string value = "";
249+ try
250+ {
251+ using (SQLiteCommand cmd = cnn.CreateCommand())
252+ {
253+ cmd.CommandText = "SELECT VALUE FROM Information WHERE ID=@id";
254+ cmd.Parameters.AddWithValue("id", id);
255+ using (SQLiteDataReader reader = cmd.ExecuteReader())
256+ {
257+ while (reader.Read())
258+ {
259+ value = reader[0].ToString();
260+ break;
261+ }
262+ }
263+ }
264+ }
265+ catch (Exception e)
266+ {
267+ Debug.WriteLine(e.Message);
268+ }
269+ return value;
270+ }
271+
272+ // 値を設定する.
273+ private void SetInformationValue(string id, string value)
274+ {
275+ // 値を追加する.
276+ try
277+ {
278+ using (SQLiteCommand cmd = cnn.CreateCommand())
279+ {
280+ // acpathを追加する.
281+ cmd.CommandText = "INSERT OR REPLACE INTO Information (ID,VALUE) VALUES(@id,@value)";
282+ cmd.Parameters.AddWithValue("id", id);
283+ cmd.Parameters.AddWithValue("value", value);
284+ cmd.ExecuteNonQuery();
285+ }
286+ }
287+ catch (Exception e)
288+ {
289+ Debug.WriteLine(e.Message);
290+ }
291+ }
292+
293+ // informationアクセス
294+ public string this[string key]
295+ {
296+ get { return GetInformationValue(key); }
297+ set { SetInformationValue(key, value); }
298+ }
299+
300+ //トランザクションを開始する.
301+ public SQLiteTransaction BeginTransaction()
302+ {
303+ return cnn.BeginTransaction();
304+ }
305+
306+ //インデックスを作成する.
307+ public void CreateIndex()
308+ {
309+ using (SQLiteCommand cmd = cnn.CreateCommand())
310+ {
311+ try
312+ {
313+ cmd.CommandText = "CREATE INDEX FilesEntry_Hash ON FilesEntry(HASH)";
314+ cmd.ExecuteNonQuery();
315+ }
316+ catch (Exception e)
317+ {
318+ Debug.WriteLine(e.Message);
319+ }
320+ try
321+ {
322+ cmd.CommandText = "CREATE INDEX ZipTahFilesEntry_Hash ON ZipTahFilesEntry(HASH)";
323+ cmd.ExecuteNonQuery();
324+ }
325+ catch (Exception e)
326+ {
327+ Debug.WriteLine(e.Message);
328+ }
329+ try
330+ {
331+ cmd.CommandText = "CREATE INDEX FilesEntry_Path ON FilesEntry(PATH)";
332+ cmd.ExecuteNonQuery();
333+ }
334+ catch (Exception e)
335+ {
336+ Debug.WriteLine(e.Message);
337+ }
338+ try
339+ {
340+ cmd.CommandText = "CREATE INDEX TahEntry_Path ON TahEntry(PATH)";
341+ cmd.ExecuteNonQuery();
342+ }
343+ catch (Exception e)
344+ {
345+ Debug.WriteLine(e.Message);
346+ }
347+ try
348+ {
349+ cmd.CommandText = "CREATE INDEX ZipEntry_Path ON ZipEntry(PATH)";
350+ cmd.ExecuteNonQuery();
351+ }
352+ catch (Exception e)
353+ {
354+ Debug.WriteLine(e.Message);
355+ }
356+ try
357+ {
358+ cmd.CommandText = "CREATE INDEX ZipTahEntry_Path ON ZipTahEntry(PATH)";
359+ cmd.ExecuteNonQuery();
360+ }
361+ catch (Exception e)
362+ {
363+ Debug.WriteLine(e.Message);
364+ }
365+ try
366+ {
367+ cmd.CommandText = "CREATE INDEX TahEntry_SHORTNAME ON TahEntry(SHORTNAME)";
368+ cmd.ExecuteNonQuery();
369+ }
370+ catch (Exception e)
371+ {
372+ Debug.WriteLine(e.Message);
373+ }
374+ try
375+ {
376+ cmd.CommandText = "CREATE INDEX ZipTahEntry_SHORTNAME ON ZipTahEntry(SHORTNAME)";
377+ cmd.ExecuteNonQuery();
378+ }
379+ catch (Exception e)
380+ {
381+ Debug.WriteLine(e.Message);
382+ }
383+ try
384+ {
385+ cmd.CommandText = "CREATE INDEX ZipTahFilesEntry_Path ON ZipTahFilesEntry(PATH)";
386+ cmd.ExecuteNonQuery();
387+ }
388+ catch (Exception e)
389+ {
390+ Debug.WriteLine(e.Message);
391+ }
392+ }
393+ }
394+
395+ public void DropIndex()
396+ {
397+ using (SQLiteCommand cmd = cnn.CreateCommand())
398+ {
399+ try
400+ {
401+ cmd.CommandText = "DROP INDEX FilesEntry_Hash";
402+ cmd.ExecuteNonQuery();
403+ }
404+ catch (Exception e)
405+ {
406+ Debug.WriteLine(e.Message);
407+ }
408+ try
409+ {
410+ cmd.CommandText = "DROP INDEX ZipTahFilesEntry_Hash";
411+ cmd.ExecuteNonQuery();
412+ }
413+ catch (Exception e)
414+ {
415+ Debug.WriteLine(e.Message);
416+ }
417+ try
418+ {
419+ cmd.CommandText = "DROP INDEX FilesEntry_Path";
420+ cmd.ExecuteNonQuery();
421+ }
422+ catch (Exception e)
423+ {
424+ Debug.WriteLine(e.Message);
425+ }
426+ try
427+ {
428+ cmd.CommandText = "DROP INDEX TahEntry_Path";
429+ cmd.ExecuteNonQuery();
430+ }
431+ catch (Exception e)
432+ {
433+ Debug.WriteLine(e.Message);
434+ }
435+ try
436+ {
437+ cmd.CommandText = "DROP INDEX ZipEntry_Path";
438+ cmd.ExecuteNonQuery();
439+ }
440+ catch (Exception e)
441+ {
442+ Debug.WriteLine(e.Message);
443+ }
444+ try
445+ {
446+ cmd.CommandText = "DROP INDEX ZipTahEntry_Path";
447+ cmd.ExecuteNonQuery();
448+ }
449+ catch (Exception e)
450+ {
451+ Debug.WriteLine(e.Message);
452+ }
453+ try
454+ {
455+ cmd.CommandText = "DROP INDEX TahEntry_SHORTNAME";
456+ cmd.ExecuteNonQuery();
457+ }
458+ catch (Exception e)
459+ {
460+ Debug.WriteLine(e.Message);
461+ }
462+ try
463+ {
464+ cmd.CommandText = "DROP INDEX ZipTahEntry_SHORTNAME";
465+ cmd.ExecuteNonQuery();
466+ }
467+ catch (Exception e)
468+ {
469+ Debug.WriteLine(e.Message);
470+ }
471+ try
472+ {
473+ cmd.CommandText = "DROP INDEX ZipTahFilesEntry_Path";
474+ cmd.ExecuteNonQuery();
475+ }
476+ catch (Exception e)
477+ {
478+ Debug.WriteLine(e.Message);
479+ }
480+ }
481+ }
482+
483+ public void Vacuum()
484+ {
485+ try
486+ {
487+ using (SQLiteCommand cmd = cnn.CreateCommand())
488+ {
489+ cmd.CommandText = "VACUUM";
490+ cmd.ExecuteNonQuery();
491+ }
492+ }
493+ catch (Exception e)
494+ {
495+ Debug.WriteLine(e.Message);
496+ }
497+ }
498+
499+
500+ // 特定のtahを返す.
501+ public ArcsTahEntry GetTah(int tahid)
502+ {
503+ ArcsTahEntry entry = null;
504+ using (SQLiteCommand cmd = cnn.CreateCommand())
505+ {
506+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,EXIST,TAHVERSION,DATETIME FROM TahEntry WHERE ID=@tahid";
507+ cmd.Parameters.AddWithValue("tahid", tahid);
508+ using (SQLiteDataReader reader = cmd.ExecuteReader())
509+ {
510+ while (reader.Read())
511+ {
512+ entry = new ArcsTahEntry();
513+ entry.id = int.Parse(reader[0].ToString());
514+ entry.path = reader[1].ToString();
515+ entry.shortname = reader[2].ToString();
516+ entry.exist = int.Parse(reader[3].ToString());
517+ entry.version = int.Parse(reader[4].ToString());
518+ entry.datetime = DateTime.Parse(reader[5].ToString());
519+ break;
520+ }
521+ }
522+ }
523+ return entry;
524+ }
525+ // 特定のtahを返す.
526+ public ArcsTahEntry GetTah(string path)
527+ {
528+ ArcsTahEntry entry = null;
529+ using (SQLiteCommand cmd = cnn.CreateCommand())
530+ {
531+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,EXIST,TAHVERSION,DATETIME FROM TahEntry WHERE PATH=@path";
532+ cmd.Parameters.AddWithValue("path", path);
533+ using (SQLiteDataReader reader = cmd.ExecuteReader())
534+ {
535+ while (reader.Read())
536+ {
537+ entry = new ArcsTahEntry();
538+ entry.id = int.Parse(reader[0].ToString());
539+ entry.path = reader[1].ToString();
540+ entry.shortname = reader[2].ToString();
541+ entry.exist = int.Parse(reader[3].ToString());
542+ entry.version = int.Parse(reader[4].ToString());
543+ entry.datetime = DateTime.Parse(reader[5].ToString());
544+ break;
545+ }
546+ }
547+ }
548+ return entry;
549+ }
550+ // 全てのtahを返す.
551+ public List<ArcsTahEntry> GetTahs()
552+ {
553+ List<ArcsTahEntry> list = new List<ArcsTahEntry>();
554+ try
555+ {
556+ using (SQLiteCommand cmd = cnn.CreateCommand())
557+ {
558+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,EXIST,TAHVERSION,DATETIME FROM TahEntry ORDER BY PATH";
559+ using (SQLiteDataReader reader = cmd.ExecuteReader())
560+ {
561+ while (reader.Read())
562+ {
563+ ArcsTahEntry entry = new ArcsTahEntry();
564+ entry.id = int.Parse(reader[0].ToString());
565+ entry.path = reader[1].ToString();
566+ entry.shortname = reader[2].ToString();
567+ entry.exist = int.Parse(reader[3].ToString());
568+ entry.version = int.Parse(reader[4].ToString());
569+ entry.datetime = DateTime.Parse(reader[5].ToString());
570+ list.Add(entry);
571+ }
572+ }
573+ }
574+ }
575+ catch (Exception e)
576+ {
577+ Debug.WriteLine(e.Message);
578+ }
579+ return list;
580+ }
581+
582+ // 特定のTAHファイルを削除する.
583+ public void DeleteTah(int id)
584+ {
585+ using (SQLiteCommand cmd = cnn.CreateCommand())
586+ {
587+ // tahに含まれるファイルを削除する.
588+ cmd.CommandText = "DELETE FROM FilesEntry WHERE TAHID = '" + id.ToString() + "'";
589+ cmd.ExecuteNonQuery();
590+ }
591+ // tahを削除する.
592+ using (SQLiteCommand cmd = cnn.CreateCommand())
593+ {
594+ cmd.CommandText = "DELETE FROM TahEntry WHERE ID = '" + id.ToString() + "'";
595+ cmd.ExecuteNonQuery();
596+ }
597+ }
598+
599+ private void makeTahTemporaryIndex()
600+ {
601+ try
602+ {
603+ using (SQLiteCommand cmd = cnn.CreateCommand())
604+ {
605+ cmd.CommandText = "CREATE INDEX DeleteTemp_TAHID ON FilesEntry(TAHID)";
606+ cmd.ExecuteNonQuery();
607+ }
608+ }
609+ catch (Exception e)
610+ {
611+ Debug.WriteLine(e.Message);
612+ }
613+ }
614+
615+ private void dropTahTemporaryIndex()
616+ {
617+ try
618+ {
619+ using (SQLiteCommand cmd = cnn.CreateCommand())
620+ {
621+ cmd.CommandText = "DROP INDEX DeleteTemp_TAHID";
622+ cmd.ExecuteNonQuery();
623+ }
624+ }
625+ catch (Exception e)
626+ {
627+ Debug.WriteLine(e.Message);
628+ }
629+ }
630+
631+ // 存在しないエントリを削除する.
632+ public void DeleteNoExistentTah()
633+ {
634+ makeTahTemporaryIndex();
635+ // tahファイル一覧を取得する.
636+ List<ArcsTahEntry> tahs = GetTahs();
637+ foreach (ArcsTahEntry tah in tahs)
638+ {
639+ if (tah.exist == 0)
640+ {
641+ TSOSorter.TDCGExplorer.SetToolTips("Deleting " + Path.GetFileName(tah.path));
642+ DeleteTah(tah.id);
643+ }
644+ }
645+ dropTahTemporaryIndex();
646+ }
647+
648+ // 全てのtahの存在フラグを落とす.
649+ public void UpdateTahExistDown()
650+ {
651+ using (SQLiteCommand cmd = cnn.CreateCommand())
652+ {
653+ cmd.CommandText = "UPDATE TahEntry SET EXIST='0'";
654+ cmd.ExecuteNonQuery();
655+ }
656+ }
657+
658+ // 指定したtahの存在フラグを立てる.
659+ public void UpdateTahExistUp(int id)
660+ {
661+ using (SQLiteCommand cmd = cnn.CreateCommand())
662+ {
663+ cmd.CommandText = "UPDATE TahEntry SET EXIST='1' WHERE ID='" + id.ToString() + "'";
664+ cmd.ExecuteNonQuery();
665+ }
666+ }
667+
668+ // 存在して追加するからexistは常に1
669+ public int SetTahEntry(ArcsTahEntry entry /*string path, int version*/)
670+ {
671+ string id = "";
672+ using (SQLiteCommand cmd = cnn.CreateCommand())
673+ {
674+ cmd.CommandText = "INSERT INTO TahEntry (PATH,SHORTNAME,EXIST,TAHVERSION,DATETIME) VALUES(@path, @shortname, '1',@version,@datetime)";
675+ cmd.Parameters.AddWithValue("path", entry.path);
676+ cmd.Parameters.AddWithValue("shortname", entry.shortname);
677+ cmd.Parameters.AddWithValue("version", entry.version.ToString());
678+ cmd.Parameters.AddWithValue("datetime", entry.datetime.ToString());
679+ cmd.ExecuteNonQuery();
680+ cmd.CommandText = "SELECT last_insert_rowid()";
681+ using (SQLiteDataReader reader = cmd.ExecuteReader())
682+ {
683+ while (reader.Read())
684+ {
685+ id = reader[0].ToString();
686+ break;
687+ }
688+ }
689+ }
690+ return int.Parse(id);
691+ }
692+
693+ // 指定したtahに含まれるファイルを取得する.
694+ public List<ArcsTahFilesEntry> GetTahFilesPath(int tahid)
695+ {
696+ List<ArcsTahFilesEntry> value = new List<ArcsTahFilesEntry>();
697+ using (SQLiteCommand cmd = cnn.CreateCommand())
698+ {
699+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM FilesEntry WHERE TAHID=@tahid";
700+ cmd.Parameters.AddWithValue("tahid", tahid.ToString());
701+ using (SQLiteDataReader reader = cmd.ExecuteReader())
702+ {
703+ while (reader.Read())
704+ {
705+ ArcsTahFilesEntry entry = new ArcsTahFilesEntry();
706+ entry.id = int.Parse(reader[0].ToString());
707+ entry.tahid = int.Parse(reader[1].ToString());
708+ entry.tahentry = int.Parse(reader[2].ToString());
709+ entry.path = reader[3].ToString();
710+ entry.hash = int.Parse(reader[4].ToString());
711+ entry.length = int.Parse(reader[5].ToString());
712+ value.Add(entry);
713+ }
714+ }
715+ }
716+ return value;
717+ }
718+
719+ // 指定したtahに含まれるファイルを取得する.
720+ public List<ArcsTahFilesEntry> GetTahFilesPathHasString(string key)
721+ {
722+ List<ArcsTahFilesEntry> value = new List<ArcsTahFilesEntry>();
723+ using (SQLiteCommand cmd = cnn.CreateCommand())
724+ {
725+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM FilesEntry WHERE PATH LIKE '%" + key + "%'";
726+ using (SQLiteDataReader reader = cmd.ExecuteReader())
727+ {
728+ while (reader.Read())
729+ {
730+ ArcsTahFilesEntry entry = new ArcsTahFilesEntry();
731+ entry.id = int.Parse(reader[0].ToString());
732+ entry.tahid = int.Parse(reader[1].ToString());
733+ entry.tahentry = int.Parse(reader[2].ToString());
734+ entry.path = reader[3].ToString();
735+ entry.hash = int.Parse(reader[4].ToString());
736+ entry.length = int.Parse(reader[5].ToString());
737+ value.Add(entry);
738+ }
739+ }
740+ }
741+ return value;
742+ }
743+
744+
745+ // TAH内部ファイルを格納する.
746+ public int SetTahFilesPath(ArcsTahFilesEntry entry)
747+ {
748+ string id = null;
749+ using (SQLiteCommand cmd = cnn.CreateCommand())
750+ {
751+ cmd.CommandText = "INSERT INTO FilesEntry (TAHID,TAHENTRY,PATH,HASH,LENGTH) VALUES(@tahid,@tahentry,@path,@hash,@length )";
752+ cmd.Parameters.AddWithValue("tahid", entry.tahid);
753+ cmd.Parameters.AddWithValue("tahentry", entry.tahentry);
754+ cmd.Parameters.AddWithValue("path", entry.path);
755+ cmd.Parameters.AddWithValue("hash", entry.hash.ToString());
756+ cmd.Parameters.AddWithValue("length", entry.length);
757+ cmd.ExecuteNonQuery();
758+ cmd.CommandText = "SELECT last_insert_rowid()";
759+ using (SQLiteDataReader reader = cmd.ExecuteReader())
760+ {
761+ while (reader.Read())
762+ {
763+ id = reader[0].ToString();
764+ break;
765+ }
766+ }
767+ }
768+ return int.Parse(id);
769+ }
770+
771+/* // ZIPエントリを追加する.
772+ public int SetZipEntry(ArcsZipArcEntry entry)
773+ {
774+ string id = null;
775+ using (SQLiteCommand cmd = cnn.CreateCommand())
776+ {
777+ cmd.CommandText = "INSERT INTO ZipEntry (PATH,CODE,EXIST,DATETIME) VALUES(@path,@code,@exist,@datetime)";
778+ cmd.Parameters.AddWithValue("path", entry.path);
779+ cmd.Parameters.AddWithValue("code", entry.code);
780+ cmd.Parameters.AddWithValue("exist", entry.exist);
781+ cmd.Parameters.AddWithValue("datetime", entry.datetime.ToString());
782+ cmd.ExecuteNonQuery();
783+ cmd.CommandText = "SELECT last_insert_rowid()";
784+ using (SQLiteDataReader reader = cmd.ExecuteReader())
785+ {
786+ while (reader.Read())
787+ {
788+ id = reader[0].ToString();
789+ break;
790+ }
791+ }
792+ }
793+ return int.Parse(id);
794+ }
795+
796+ // ZIPエントリを取得する.
797+ public List<ArcsZipArcEntry> GetZips()
798+ {
799+ List<ArcsZipArcEntry> list = new List<ArcsZipArcEntry>();
800+ using (SQLiteCommand cmd = cnn.CreateCommand())
801+ {
802+ cmd.CommandText = "SELECT ID,PATH,CODE,EXIST,DATETIME FROM ZipEntry ORDER BY PATH";
803+ using (SQLiteDataReader reader = cmd.ExecuteReader())
804+ {
805+ while (reader.Read())
806+ {
807+ ArcsZipArcEntry entry = new ArcsZipArcEntry();
808+ entry.id = int.Parse(reader[0].ToString());
809+ entry.path = reader[1].ToString();
810+ entry.code = reader[2].ToString();
811+ entry.exist = int.Parse(reader[3].ToString());
812+ entry.datetime = DateTime.Parse(reader[4].ToString());
813+ list.Add(entry);
814+ }
815+ }
816+ }
817+ return list;
818+ }
819+
820+ // ZIPエントリを取得する.
821+ public ArcsZipArcEntry GetZip(int zipid)
822+ {
823+ ArcsZipArcEntry entry = null;
824+ using (SQLiteCommand cmd = cnn.CreateCommand())
825+ {
826+ cmd.CommandText = "SELECT ID,PATH,CODE,EXIST,DATETIME FROM ZipEntry WHERE ID=@zipid";
827+ cmd.Parameters.AddWithValue("zipid", zipid.ToString());
828+ using (SQLiteDataReader reader = cmd.ExecuteReader())
829+ {
830+ while (reader.Read())
831+ {
832+ entry = new ArcsZipArcEntry();
833+ entry.id = int.Parse(reader[0].ToString());
834+ entry.path = reader[1].ToString();
835+ entry.code = reader[2].ToString();
836+ entry.exist = int.Parse(reader[3].ToString());
837+ entry.datetime = DateTime.Parse(reader[4].ToString());
838+ break;
839+ }
840+ }
841+ }
842+ return entry;
843+ }
844+
845+ // ZIPエントリを取得する.
846+ public ArcsZipArcEntry GetZip(string path)
847+ {
848+ ArcsZipArcEntry entry = null;
849+ using (SQLiteCommand cmd = cnn.CreateCommand())
850+ {
851+ cmd.CommandText = "SELECT ID,PATH,CODE,EXIST,DATETIME FROM ZipEntry WHERE PATH=@path";
852+ cmd.Parameters.AddWithValue("path", path);
853+ using (SQLiteDataReader reader = cmd.ExecuteReader())
854+ {
855+ while (reader.Read())
856+ {
857+ entry = new ArcsZipArcEntry();
858+ entry.id = int.Parse(reader[0].ToString());
859+ entry.path = reader[1].ToString();
860+ entry.code = reader[2].ToString();
861+ entry.exist = int.Parse(reader[3].ToString());
862+ entry.datetime = DateTime.Parse(reader[4].ToString());
863+ break;
864+ }
865+ }
866+ }
867+ return entry;
868+ }
869+
870+ // ZIPエントリを取得する.
871+ public ArcsZipArcEntry GetZipByCode(string code)
872+ {
873+ ArcsZipArcEntry entry = null;
874+ using (SQLiteCommand cmd = cnn.CreateCommand())
875+ {
876+ cmd.CommandText = "SELECT ID,PATH,CODE,EXIST,DATETIME FROM ZipEntry WHERE CODE=@code";
877+ cmd.Parameters.AddWithValue("code", code);
878+ using (SQLiteDataReader reader = cmd.ExecuteReader())
879+ {
880+ while (reader.Read())
881+ {
882+ entry = new ArcsZipArcEntry();
883+ entry.id = int.Parse(reader[0].ToString());
884+ entry.path = reader[1].ToString();
885+ entry.code = reader[2].ToString();
886+ entry.exist = int.Parse(reader[3].ToString());
887+ entry.datetime = DateTime.Parse(reader[4].ToString());
888+ break;
889+ }
890+ }
891+ }
892+ return entry;
893+ }
894+
895+#if false
896+ // ZIPエントリを取得する.
897+ public string GetZipID(string path)
898+ {
899+ string id = null;
900+ using (SQLiteCommand cmd = cnn.CreateCommand())
901+ {
902+ cmd.CommandText = "SELECT ID FROM ZipEntry WHERE path=@path";
903+ cmd.Parameters.AddWithValue("path", path);
904+ using (SQLiteDataReader reader = cmd.ExecuteReader())
905+ {
906+ while (reader.Read())
907+ {
908+ id = reader[0].ToString();
909+ break;
910+ }
911+ }
912+ }
913+ return id;
914+ }
915+#endif
916+ // 全てのzipの存在フラグを落とす.
917+ public void UpdateZipExistDown()
918+ {
919+ using (SQLiteCommand cmd = cnn.CreateCommand())
920+ {
921+ cmd.CommandText = "UPDATE ZipEntry SET EXIST='0'";
922+ cmd.ExecuteNonQuery();
923+ }
924+ }
925+
926+ // 指定したzipの存在フラグを立てる.
927+ public void UpdateZipExistUp(int id)
928+ {
929+ using (SQLiteCommand cmd = cnn.CreateCommand())
930+ {
931+ cmd.CommandText = "UPDATE ZipEntry SET EXIST='1' WHERE ID='" + id.ToString() + "'";
932+ cmd.ExecuteNonQuery();
933+ }
934+ }
935+
936+ // 特定のZIPファイルを削除する.
937+ public void DeleteZip(int id)
938+ {
939+ // ZIP中のTAHを取得する(TAHIDごとに個別削除).
940+ List<ArcsZipTahEntry> list = GetZipTahs(id);
941+ foreach (ArcsZipTahEntry tah in list)
942+ {
943+ using (SQLiteCommand cmd = cnn.CreateCommand())
944+ {
945+ cmd.CommandText = "DELETE FROM ZipTahFilesEntry WHERE TAHID = '" + tah.id.ToString() + "'";
946+ cmd.ExecuteNonQuery();
947+ }
948+ }
949+ // tahファイルを削除する(ZIPIDで一括削除).
950+ using (SQLiteCommand cmd = cnn.CreateCommand())
951+ {
952+ cmd.CommandText = "DELETE FROM ZipTahEntry WHERE ZIPID = '" + id.ToString() + "'";
953+ cmd.ExecuteNonQuery();
954+ }
955+ // EXISTが0のエントリを一括削除する.
956+ using (SQLiteCommand cmd = cnn.CreateCommand())
957+ {
958+ cmd.CommandText = "DELETE FROM ZipEntry WHERE ID = '" + id.ToString() + "'";
959+ cmd.ExecuteNonQuery();
960+ }
961+ }
962+
963+ private void makeZipTemporaryIndex()
964+ {
965+ try
966+ {
967+ using (SQLiteCommand cmd = cnn.CreateCommand())
968+ {
969+ cmd.CommandText = "CREATE INDEX DeleteTemp_TAHID ON ZipTahFilesEntry(TAHID)";
970+ cmd.ExecuteNonQuery();
971+ }
972+ }
973+ catch (Exception e)
974+ {
975+ Debug.WriteLine(e.Message);
976+ }
977+ try
978+ {
979+ using (SQLiteCommand cmd = cnn.CreateCommand())
980+ {
981+ cmd.CommandText = "CREATE INDEX DeleteTemp_TAHID2 ON ZipTahEntry(ZIPID)";
982+ cmd.ExecuteNonQuery();
983+ }
984+ }
985+ catch (Exception e)
986+ {
987+ Debug.WriteLine(e.Message);
988+ }
989+ }
990+
991+ private void dropZipTemporaryIndex()
992+ {
993+ try
994+ {
995+ using (SQLiteCommand cmd = cnn.CreateCommand())
996+ {
997+ cmd.CommandText = "DROP INDEX DeleteTemp_TAHID";
998+ cmd.ExecuteNonQuery();
999+ }
1000+ }
1001+ catch (Exception e)
1002+ {
1003+ Debug.WriteLine(e.Message);
1004+ }
1005+ try
1006+ {
1007+ using (SQLiteCommand cmd = cnn.CreateCommand())
1008+ {
1009+ cmd.CommandText = "DROP INDEX DeleteTemp_TAHID2;";
1010+ cmd.ExecuteNonQuery();
1011+ }
1012+ }
1013+ catch (Exception e)
1014+ {
1015+ Debug.WriteLine(e.Message);
1016+ }
1017+ }
1018+
1019+ // 存在しないエントリを削除する.
1020+ public void DeleteNoExistentZip()
1021+ {
1022+ makeZipTemporaryIndex();
1023+ // tahファイル一覧を取得する.
1024+ List<ArcsZipArcEntry> zips = GetZips();
1025+ foreach (ArcsZipArcEntry zip in zips)
1026+ {
1027+ if (zip.exist == 0)
1028+ {
1029+ TDCGExplorer.SetToolTips("Deleting " + Path.GetFileName(zip.path));
1030+ DeleteZip(zip.id);
1031+ }
1032+ }
1033+ dropZipTemporaryIndex();
1034+ }
1035+
1036+ // ZIP中のtahファイルを追加する.
1037+ public int SetZipTahEntry(ArcsZipTahEntry entry)
1038+ {
1039+ string id = "";
1040+ using (SQLiteCommand cmd = cnn.CreateCommand())
1041+ {
1042+ cmd.CommandText = "INSERT INTO ZipTahEntry (ZIPID,PATH,SHORTNAME,TAHVERSION) VALUES(@zipid,@path,@shortname,@version)";
1043+ cmd.Parameters.AddWithValue("zipid", entry.zipid);
1044+ cmd.Parameters.AddWithValue("path", entry.path);
1045+ cmd.Parameters.AddWithValue("shortname", entry.shortname);
1046+ cmd.Parameters.AddWithValue("version", entry.version.ToString());
1047+ cmd.ExecuteNonQuery();
1048+ cmd.CommandText = "SELECT last_insert_rowid()";
1049+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1050+ {
1051+ while (reader.Read())
1052+ {
1053+ id = reader[0].ToString();
1054+ break;
1055+ }
1056+ }
1057+ }
1058+ return int.Parse(id);
1059+ }
1060+
1061+ // TAH内部ファイルを格納する.
1062+ public int SetZipTahFilesPath(ArcsTahFilesEntry entry)
1063+ {
1064+ string id = null;
1065+ using (SQLiteCommand cmd = cnn.CreateCommand())
1066+ {
1067+ cmd.CommandText = "INSERT INTO ZipTahFilesEntry (TAHID,TAHENTRY,PATH,HASH,LENGTH) VALUES(@tahid,@tahentry,@path,@hash,@length )";
1068+ cmd.Parameters.AddWithValue("tahid", entry.tahid);
1069+ cmd.Parameters.AddWithValue("tahentry", entry.tahentry);
1070+ cmd.Parameters.AddWithValue("path", entry.path);
1071+ cmd.Parameters.AddWithValue("hash", entry.hash.ToString());
1072+ cmd.Parameters.AddWithValue("length", entry.length);
1073+ cmd.ExecuteNonQuery();
1074+ cmd.CommandText = "SELECT last_insert_rowid()";
1075+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1076+ {
1077+ while (reader.Read())
1078+ {
1079+ id = reader[0].ToString();
1080+ break;
1081+ }
1082+ }
1083+ }
1084+ return int.Parse(id);
1085+ }
1086+
1087+ // ZIP中の全てのファイルを返す.
1088+ public List<ArcsZipTahEntry> GetZipTahs(int zipid)
1089+ {
1090+ List<ArcsZipTahEntry> list = new List<ArcsZipTahEntry>();
1091+ try
1092+ {
1093+ using (SQLiteCommand cmd = cnn.CreateCommand())
1094+ {
1095+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,TAHVERSION,ZIPID FROM ZipTahEntry WHERE ZIPID=@zipid";
1096+ cmd.Parameters.AddWithValue("zipid", zipid.ToString());
1097+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1098+ {
1099+ while (reader.Read())
1100+ {
1101+ ArcsZipTahEntry entry = new ArcsZipTahEntry();
1102+ entry.id = int.Parse(reader[0].ToString());
1103+ entry.path = reader[1].ToString();
1104+ entry.shortname = reader[2].ToString();
1105+ entry.version = int.Parse(reader[3].ToString());
1106+ entry.zipid = int.Parse(reader[4].ToString());
1107+ list.Add(entry);
1108+ }
1109+ }
1110+ }
1111+ }
1112+ catch (Exception e)
1113+ {
1114+ Debug.WriteLine(e.Message);
1115+ }
1116+ return list;
1117+ }
1118+
1119+ // 指定した文字列を含むエントリをすべて返す
1120+ public List<ArcsZipTahEntry> GetZipTahsHasString(string key)
1121+ {
1122+ List<ArcsZipTahEntry> list = new List<ArcsZipTahEntry>();
1123+ try
1124+ {
1125+ using (SQLiteCommand cmd = cnn.CreateCommand())
1126+ {
1127+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,TAHVERSION,ZIPID FROM ZipTahEntry WHERE SHORTNAME LIKE '%" + key + "%'";
1128+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1129+ {
1130+ while (reader.Read())
1131+ {
1132+ ArcsZipTahEntry entry = new ArcsZipTahEntry();
1133+ entry.id = int.Parse(reader[0].ToString());
1134+ entry.path = reader[1].ToString();
1135+ entry.shortname = reader[2].ToString();
1136+ entry.version = int.Parse(reader[3].ToString());
1137+ entry.zipid = int.Parse(reader[4].ToString());
1138+ list.Add(entry);
1139+ }
1140+ }
1141+ }
1142+ }
1143+ catch (Exception e)
1144+ {
1145+ Debug.WriteLine(e.Message);
1146+ }
1147+ return list;
1148+ }
1149+
1150+
1151+ // ZIP中の指定したTAHを取得する.
1152+ public ArcsZipTahEntry GetZipTah(int tahid)
1153+ {
1154+ ArcsZipTahEntry entry = new ArcsZipTahEntry();
1155+ using (SQLiteCommand cmd = cnn.CreateCommand())
1156+ {
1157+ cmd.CommandText = "SELECT ID,PATH,SHORTNAME,TAHVERSION,ZIPID FROM ZipTahEntry WHERE ID=@tahid";
1158+ cmd.Parameters.AddWithValue("tahid", tahid.ToString());
1159+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1160+ {
1161+ while (reader.Read())
1162+ {
1163+ entry.id = int.Parse(reader[0].ToString());
1164+ entry.path = reader[1].ToString();
1165+ entry.shortname = reader[2].ToString();
1166+ entry.version = int.Parse(reader[3].ToString());
1167+ entry.zipid = int.Parse(reader[4].ToString());
1168+ break;
1169+ }
1170+ }
1171+ }
1172+ return entry;
1173+ }*/
1174+
1175+ // 指定したtahに含まれるファイルを取得する.
1176+ public List<ArcsTahFilesEntry> GetZipTahFilesEntries(int tahid)
1177+ {
1178+ List<ArcsTahFilesEntry> value = new List<ArcsTahFilesEntry>();
1179+ using (SQLiteCommand cmd = cnn.CreateCommand())
1180+ {
1181+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM ZipTahFilesEntry WHERE TAHID=@tahid";
1182+ cmd.Parameters.AddWithValue("tahid", tahid.ToString());
1183+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1184+ {
1185+ while (reader.Read())
1186+ {
1187+ ArcsTahFilesEntry entry = new ArcsTahFilesEntry();
1188+ entry.id = int.Parse(reader[0].ToString());
1189+ entry.tahid = int.Parse(reader[1].ToString());
1190+ entry.tahentry = int.Parse(reader[2].ToString());
1191+ entry.path = reader[3].ToString();
1192+ entry.hash = int.Parse(reader[4].ToString());
1193+ entry.length = int.Parse(reader[5].ToString());
1194+ value.Add(entry);
1195+ }
1196+ }
1197+ }
1198+ return value;
1199+ }
1200+
1201+ // 指定したtahに含まれるファイルを取得する.
1202+ public List<ArcsTahFilesEntry> GetZipTahFilesEntriesHasString(string key)
1203+ {
1204+ List<ArcsTahFilesEntry> value = new List<ArcsTahFilesEntry>();
1205+ using (SQLiteCommand cmd = cnn.CreateCommand())
1206+ {
1207+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM ZipTahFilesEntry WHERE TAHID='%" + key + "%'";
1208+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1209+ {
1210+ while (reader.Read())
1211+ {
1212+ ArcsTahFilesEntry entry = new ArcsTahFilesEntry();
1213+ entry.id = int.Parse(reader[0].ToString());
1214+ entry.tahid = int.Parse(reader[1].ToString());
1215+ entry.tahentry = int.Parse(reader[2].ToString());
1216+ entry.path = reader[3].ToString();
1217+ entry.hash = int.Parse(reader[4].ToString());
1218+ entry.length = int.Parse(reader[5].ToString());
1219+ value.Add(entry);
1220+ }
1221+ }
1222+ }
1223+ return value;
1224+ }
1225+
1226+
1227+ // 指定したファイルを取得する.
1228+ public List<ArcsTahFilesEntry> GetZipTahFilesEntries(uint hash)
1229+ {
1230+ List<ArcsTahFilesEntry> list = new List<ArcsTahFilesEntry>();
1231+ using (SQLiteCommand cmd = cnn.CreateCommand())
1232+ {
1233+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM ZipTahFilesEntry WHERE HASH=@hash";
1234+ cmd.Parameters.AddWithValue("hash", (int)hash);
1235+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1236+ {
1237+ while (reader.Read())
1238+ {
1239+ ArcsTahFilesEntry entry = new ArcsTahFilesEntry();
1240+ entry.id = int.Parse(reader[0].ToString());
1241+ entry.tahid = int.Parse(reader[1].ToString());
1242+ entry.tahentry = int.Parse(reader[2].ToString());
1243+ entry.path = reader[3].ToString();
1244+ entry.hash = int.Parse(reader[4].ToString());
1245+ entry.length = int.Parse(reader[5].ToString());
1246+ list.Add(entry);
1247+ }
1248+ }
1249+ }
1250+ return list;
1251+ }
1252+
1253+ // 指定したIDのファイルを取得する.
1254+ public ArcsTahFilesEntry GetTahFilesEntry(int filesid)
1255+ {
1256+ ArcsTahFilesEntry entry = null;
1257+ using (SQLiteCommand cmd = cnn.CreateCommand())
1258+ {
1259+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM FilesEntry WHERE ID=@filesid";
1260+ cmd.Parameters.AddWithValue("filesid", filesid.ToString());
1261+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1262+ {
1263+ while (reader.Read())
1264+ {
1265+ entry = new ArcsTahFilesEntry();
1266+ entry.id = int.Parse(reader[0].ToString());
1267+ entry.tahid = int.Parse(reader[1].ToString());
1268+ entry.tahentry = int.Parse(reader[2].ToString());
1269+ entry.path = reader[3].ToString();
1270+ entry.hash = int.Parse(reader[4].ToString());
1271+ entry.length = int.Parse(reader[5].ToString());
1272+ break;
1273+ }
1274+ }
1275+ }
1276+ return entry;
1277+ }
1278+
1279+ // 指定したファイル名のtahファイルを取得する.
1280+ public List<ArcsTahFilesEntry> GetTahFilesEntry(uint hash)
1281+ {
1282+ List<ArcsTahFilesEntry> list = new List<ArcsTahFilesEntry>();
1283+ using (SQLiteCommand cmd = cnn.CreateCommand())
1284+ {
1285+ cmd.CommandText = "SELECT ID,TAHID,TAHENTRY,PATH,HASH,LENGTH FROM FilesEntry WHERE HASH=@hash";
1286+ cmd.Parameters.AddWithValue("hash", (int)hash);
1287+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1288+ {
1289+ while (reader.Read())
1290+ {
1291+ ArcsTahFilesEntry entry = null;
1292+ entry = new ArcsTahFilesEntry();
1293+ entry.id = int.Parse(reader[0].ToString());
1294+ entry.tahid = int.Parse(reader[1].ToString());
1295+ entry.tahentry = int.Parse(reader[2].ToString());
1296+ entry.path = reader[3].ToString();
1297+ entry.hash = int.Parse(reader[4].ToString());
1298+ entry.length = int.Parse(reader[5].ToString());
1299+ list.Add(entry);
1300+ }
1301+ }
1302+ }
1303+ return list;
1304+ }
1305+
1306+ /*
1307+#if false
1308+ // 指定したZIPに含まれるinstall済みtahを列挙する.
1309+ public List<ArcsTahEntry> GetInstalledTAHFiles()
1310+ {
1311+ List<ArcsTahEntry> list = new List<ArcsTahEntry>();
1312+ using (SQLiteCommand cmd = cnn.CreateCommand())
1313+ {
1314+ cmd.CommandText = "SELECT TahEntry.ID, TahEntry.PATH, TahEntry.SHORTNAME, TahEntry.TAHVERSION FROM ZipTahEntry INNER JOIN TahEntry ON TahEntry.SHORTNAME=ZipTahEntry.SHORTNAME";
1315+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1316+ {
1317+ while (reader.Read())
1318+ {
1319+ ArcsTahEntry entry = new ArcsTahEntry();
1320+ entry.id = int.Parse(reader[0].ToString());
1321+ entry.path = reader[1].ToString();
1322+ entry.shortname = reader[2].ToString();
1323+ entry.version = int.Parse(reader[3].ToString());
1324+ list.Add(entry);
1325+ }
1326+ }
1327+ }
1328+ return list;
1329+ }
1330+#endif
1331+ // インストール済みのZIP一覧を取得する.
1332+ public List<ArcsZipArcEntry> GetInstalledZipFiles()
1333+ {
1334+ List<ArcsZipArcEntry> list = new List<ArcsZipArcEntry>();
1335+
1336+ using (SQLiteCommand cmd = cnn.CreateCommand())
1337+ {
1338+ cmd.CommandText = "SELECT ZipEntry.ID,ZipEntry.PATH,ZipEntry.CODE,ZipEntry.EXIST FROM ZipEntry INNER JOIN InstalledZipEntry ON ZipEntry.ID=InstalledZipEntry.ZIPID ORDER BY ZipEntry.PATH";
1339+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1340+ {
1341+ while (reader.Read())
1342+ {
1343+ ArcsZipArcEntry entry = new ArcsZipArcEntry();
1344+ entry.id = int.Parse(reader[0].ToString());
1345+ entry.path = reader[1].ToString();
1346+ entry.code = reader[2].ToString();
1347+ entry.exist = int.Parse(reader[3].ToString());
1348+ list.Add(entry);
1349+ }
1350+ }
1351+ }
1352+ return list;
1353+ }
1354+
1355+ // インストール済み全部のzip表を作成する.
1356+ public void CreateInstalledZips()
1357+ {
1358+ using (SQLiteCommand cmd = cnn.CreateCommand())
1359+ {
1360+ try
1361+ {
1362+ cmd.CommandText = "DROP TABLE InstalledZipEntry";
1363+ cmd.ExecuteNonQuery();
1364+ }
1365+ catch (Exception e)
1366+ {
1367+ Debug.WriteLine(e.Message);
1368+ }
1369+
1370+ //cmd.CommandText = "CREATE TABLE InstalledZipEntry (ID INTEGER PRIMARY KEY, ZIPID INTEGER)";
1371+ //cmd.ExecuteNonQuery();
1372+
1373+ CreateInstalledZipTable();
1374+
1375+ cmd.CommandText = "INSERT INTO InstalledZipEntry (ZIPID) SELECT DISTINCT ZipTahEntry.ZIPID FROM ZipTahEntry INNER JOIN TahEntry ON TahEntry.SHORTNAME=ZipTahEntry.SHORTNAME";
1376+ cmd.ExecuteNonQuery();
1377+ }
1378+ }
1379+
1380+ // インストール済みZIPのハッシュを返す.
1381+ public Dictionary<int, int> GetInstalledZips()
1382+ {
1383+ Dictionary<int, int> table = new Dictionary<int, int>();
1384+
1385+ using (SQLiteCommand cmd = cnn.CreateCommand())
1386+ {
1387+ cmd.CommandText = "SELECT ZIPID FROM InstalledZipEntry";
1388+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1389+ {
1390+ while (reader.Read())
1391+ {
1392+ int zipid = int.Parse(reader[0].ToString());
1393+ if (table.ContainsKey(zipid) == false) table[zipid] = 1;
1394+ }
1395+ }
1396+ }
1397+ return table;
1398+ }*/
1399+
1400+ //衝突しているTAHIDを列挙する.
1401+ //SELECT A.TAHID AS TahID1 ,B.TAHID AS TahID2,A.ID AS FilesEntryID1, B.ID AS FilesEntryID2 from filesentry a left join filesentry b on a.hash=b.hash WHERE UPPER(a.path)<>UPPER(b.path);
1402+ public Dictionary<int, List<ArcsCollisionRecord>> GetDuplicateDomain()
1403+ {
1404+ Dictionary<int, List<ArcsCollisionRecord>> table = new Dictionary<int, List<ArcsCollisionRecord>>();
1405+
1406+ using (SQLiteCommand cmd = cnn.CreateCommand())
1407+ {
1408+ cmd.CommandText = "SELECT A.TAHID AS TahID1 ,B.TAHID AS TahID2,A.ID AS FilesEntryID1, B.ID AS FilesEntryID2 FROM FilesEntry A LEFT JOIN FilesEntry B ON A.HASH=B.HASH WHERE A.TAHID<>B.TAHID;";
1409+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1410+ {
1411+ while (reader.Read())
1412+ {
1413+ ArcsCollisionRecord entry;
1414+ entry = new ArcsCollisionRecord();
1415+ entry.fromTahID = int.Parse(reader[0].ToString());
1416+ entry.toTahID = int.Parse(reader[1].ToString());
1417+ entry.fromFilesID = int.Parse(reader[2].ToString());
1418+ entry.toFilesID = int.Parse(reader[3].ToString());
1419+ if (table.ContainsKey(entry.fromTahID) == false) table[entry.fromTahID] = new List<ArcsCollisionRecord>();
1420+ table[entry.fromTahID].Add(entry);
1421+ }
1422+ }
1423+ }
1424+ return table;
1425+ }
1426+
1427+ //衝突しているTAHIDを列挙する.
1428+ //SELECT A.TAHID AS TahID1 ,B.TAHID AS TahID2,A.ID AS FilesEntryID1, B.ID AS FilesEntryID2 from filesentry a left join filesentry b on a.hash=b.hash WHERE UPPER(a.path)<>UPPER(b.path);
1429+ public Dictionary<int, List<ArcsCollisionRecord>> GetCollisionDomain()
1430+ {
1431+ Dictionary<int, List<ArcsCollisionRecord>> table = new Dictionary<int, List<ArcsCollisionRecord>>();
1432+
1433+ using (SQLiteCommand cmd = cnn.CreateCommand())
1434+ {
1435+ cmd.CommandText = "SELECT A.TAHID AS TahID1 ,B.TAHID AS TahID2,A.ID AS FilesEntryID1, B.ID AS FilesEntryID2 FROM FilesEntry A LEFT JOIN FilesEntry B ON A.HASH=B.HASH WHERE UPPER(A.PATH)<>UPPER(B.PATH);";
1436+ using (SQLiteDataReader reader = cmd.ExecuteReader())
1437+ {
1438+ while (reader.Read())
1439+ {
1440+ ArcsCollisionRecord entry;
1441+ entry = new ArcsCollisionRecord();
1442+ entry.fromTahID = int.Parse(reader[0].ToString());
1443+ entry.toTahID = int.Parse(reader[1].ToString());
1444+ entry.fromFilesID = int.Parse(reader[2].ToString());
1445+ entry.toFilesID = int.Parse(reader[3].ToString());
1446+ if (table.ContainsKey(entry.fromTahID) == false) table[entry.fromTahID] = new List<ArcsCollisionRecord>();
1447+ table[entry.fromTahID].Add(entry);
1448+ }
1449+ }
1450+ }
1451+ return table;
1452+ }
1453+
1454+ }
1455+}
--- TSOSorter/Source/Properties/AssemblyInfo.cs (nonexistent)
+++ TSOSorter/Source/Properties/AssemblyInfo.cs (revision 3)
@@ -0,0 +1,36 @@
1+using System.Reflection;
2+using System.Runtime.CompilerServices;
3+using System.Runtime.InteropServices;
4+
5+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
6+// アセンブリに関連付けられている情報を変更するには、
7+// これらの属性値を変更してください。
8+[assembly: AssemblyTitle("TSOSorter")]
9+[assembly: AssemblyDescription("TSO名順にTAHファイルをソート表示するツール")]
10+[assembly: AssemblyConfiguration("")]
11+[assembly: AssemblyCompany("")]
12+[assembly: AssemblyProduct("TSOSorter")]
13+[assembly: AssemblyCopyright("Copyright © 2014 HogePiyo/Evisen")]
14+[assembly: AssemblyTrademark("")]
15+[assembly: AssemblyCulture("")]
16+
17+// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから
18+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
19+// その型の ComVisible 属性を true に設定してください。
20+[assembly: ComVisible(false)]
21+
22+// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
23+[assembly: Guid("41641abc-4faf-415c-ac58-8b8d9b47f36b")]
24+
25+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
26+//
27+// Major Version
28+// Minor Version
29+// Build Number
30+// Revision
31+//
32+// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を
33+// 既定値にすることができます:
34+// [assembly: AssemblyVersion("1.0.*")]
35+[assembly: AssemblyVersion("1.0.0.0")]
36+[assembly: AssemblyFileVersion("1.0.0.0")]
--- TSOSorter/Source/Properties/Settings.Designer.cs (nonexistent)
+++ TSOSorter/Source/Properties/Settings.Designer.cs (revision 3)
@@ -0,0 +1,30 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// This code was generated by a tool.
4+// Runtime Version:2.0.50727.5477
5+//
6+// Changes to this file may cause incorrect behavior and will be lost if
7+// the code is regenerated.
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace TSOSorter.Properties
12+{
13+
14+
15+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
17+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18+ {
19+
20+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21+
22+ public static Settings Default
23+ {
24+ get
25+ {
26+ return defaultInstance;
27+ }
28+ }
29+ }
30+}
--- TSOSorter/Source/Properties/Resources.Designer.cs (nonexistent)
+++ TSOSorter/Source/Properties/Resources.Designer.cs (revision 3)
@@ -0,0 +1,71 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:2.0.50727.5477
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace TSOSorter.Properties
12+{
13+
14+
15+ /// <summary>
16+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17+ /// </summary>
18+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19+ // または Visual Studio のようなツールを使用して自動生成されました。
20+ // メンバを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21+ // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
22+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
23+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25+ internal class Resources
26+ {
27+
28+ private static global::System.Resources.ResourceManager resourceMan;
29+
30+ private static global::System.Globalization.CultureInfo resourceCulture;
31+
32+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33+ internal Resources()
34+ {
35+ }
36+
37+ /// <summary>
38+ /// このクラスに使用される、キャッシュされた ResourceManager のインスタンスを返します。
39+ /// </summary>
40+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41+ internal static global::System.Resources.ResourceManager ResourceManager
42+ {
43+ get
44+ {
45+ if ((resourceMan == null))
46+ {
47+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TSOSorter.Properties.Resources", typeof(Resources).Assembly);
48+ resourceMan = temp;
49+ }
50+ return resourceMan;
51+ }
52+ }
53+
54+ /// <summary>
55+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
56+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
57+ /// </summary>
58+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59+ internal static global::System.Globalization.CultureInfo Culture
60+ {
61+ get
62+ {
63+ return resourceCulture;
64+ }
65+ set
66+ {
67+ resourceCulture = value;
68+ }
69+ }
70+ }
71+}
--- TSOSorter/Source/Options.Designer.cs (nonexistent)
+++ TSOSorter/Source/Options.Designer.cs (revision 3)
@@ -0,0 +1,132 @@
1+namespace TSOSorter
2+{
3+ partial class Options
4+ {
5+ /// <summary>
6+ /// 必要なデザイナ変数です。
7+ /// </summary>
8+ private System.ComponentModel.IContainer components = null;
9+
10+ /// <summary>
11+ /// 使用中のリソースをすべてクリーンアップします。
12+ /// </summary>
13+ /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
14+ protected override void Dispose(bool disposing)
15+ {
16+ if (disposing && (components != null))
17+ {
18+ components.Dispose();
19+ }
20+ base.Dispose(disposing);
21+ }
22+
23+ #region Windows フォーム デザイナで生成されたコード
24+
25+ /// <summary>
26+ /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
27+ /// コード エディタで変更しないでください。
28+ /// </summary>
29+ private void InitializeComponent()
30+ {
31+ this.label1 = new System.Windows.Forms.Label();
32+ this.textBoxArcsFolderPath = new System.Windows.Forms.TextBox();
33+ this.buttonArcsFolderRef = new System.Windows.Forms.Button();
34+ this.button1 = new System.Windows.Forms.Button();
35+ this.buttonTahWorkFolderRef = new System.Windows.Forms.Button();
36+ this.textBoxTahWorkFolder = new System.Windows.Forms.TextBox();
37+ this.label2 = new System.Windows.Forms.Label();
38+ this.SuspendLayout();
39+ //
40+ // label1
41+ //
42+ this.label1.AutoSize = true;
43+ this.label1.Location = new System.Drawing.Point(13, 13);
44+ this.label1.Name = "label1";
45+ this.label1.Size = new System.Drawing.Size(71, 12);
46+ this.label1.TabIndex = 0;
47+ this.label1.Text = "ARCSフォルダ";
48+ //
49+ // textBoxArcsFolderPath
50+ //
51+ this.textBoxArcsFolderPath.Location = new System.Drawing.Point(113, 10);
52+ this.textBoxArcsFolderPath.Name = "textBoxArcsFolderPath";
53+ this.textBoxArcsFolderPath.Size = new System.Drawing.Size(460, 19);
54+ this.textBoxArcsFolderPath.TabIndex = 1;
55+ //
56+ // buttonArcsFolderRef
57+ //
58+ this.buttonArcsFolderRef.Location = new System.Drawing.Point(579, 8);
59+ this.buttonArcsFolderRef.Name = "buttonArcsFolderRef";
60+ this.buttonArcsFolderRef.Size = new System.Drawing.Size(75, 23);
61+ this.buttonArcsFolderRef.TabIndex = 2;
62+ this.buttonArcsFolderRef.Text = "参照...";
63+ this.buttonArcsFolderRef.UseVisualStyleBackColor = true;
64+ this.buttonArcsFolderRef.Click += new System.EventHandler(this.buttonArcsFolderRef_Click);
65+ //
66+ // button1
67+ //
68+ this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
69+ this.button1.Location = new System.Drawing.Point(579, 61);
70+ this.button1.Name = "button1";
71+ this.button1.Size = new System.Drawing.Size(75, 23);
72+ this.button1.TabIndex = 3;
73+ this.button1.Text = "OK";
74+ this.button1.UseVisualStyleBackColor = true;
75+ this.button1.Click += new System.EventHandler(this.button1_Click);
76+ //
77+ // buttonTahWorkFolderRef
78+ //
79+ this.buttonTahWorkFolderRef.Location = new System.Drawing.Point(579, 33);
80+ this.buttonTahWorkFolderRef.Name = "buttonTahWorkFolderRef";
81+ this.buttonTahWorkFolderRef.Size = new System.Drawing.Size(75, 23);
82+ this.buttonTahWorkFolderRef.TabIndex = 6;
83+ this.buttonTahWorkFolderRef.Text = "参照...";
84+ this.buttonTahWorkFolderRef.UseVisualStyleBackColor = true;
85+ this.buttonTahWorkFolderRef.Click += new System.EventHandler(this.buttonTahWorkFolderRef_Click);
86+ //
87+ // textBoxTahWorkFolder
88+ //
89+ this.textBoxTahWorkFolder.Location = new System.Drawing.Point(113, 35);
90+ this.textBoxTahWorkFolder.Name = "textBoxTahWorkFolder";
91+ this.textBoxTahWorkFolder.Size = new System.Drawing.Size(460, 19);
92+ this.textBoxTahWorkFolder.TabIndex = 5;
93+ //
94+ // label2
95+ //
96+ this.label2.AutoSize = true;
97+ this.label2.Location = new System.Drawing.Point(13, 38);
98+ this.label2.Name = "label2";
99+ this.label2.Size = new System.Drawing.Size(99, 12);
100+ this.label2.TabIndex = 4;
101+ this.label2.Text = "TAH作業用フォルダ";
102+ //
103+ // Options
104+ //
105+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
106+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
107+ this.ClientSize = new System.Drawing.Size(678, 96);
108+ this.Controls.Add(this.buttonTahWorkFolderRef);
109+ this.Controls.Add(this.textBoxTahWorkFolder);
110+ this.Controls.Add(this.label2);
111+ this.Controls.Add(this.button1);
112+ this.Controls.Add(this.buttonArcsFolderRef);
113+ this.Controls.Add(this.textBoxArcsFolderPath);
114+ this.Controls.Add(this.label1);
115+ this.Name = "Options";
116+ this.Text = "オプション";
117+ this.ResumeLayout(false);
118+ this.PerformLayout();
119+
120+ }
121+
122+ #endregion
123+
124+ private System.Windows.Forms.Label label1;
125+ private System.Windows.Forms.TextBox textBoxArcsFolderPath;
126+ private System.Windows.Forms.Button buttonArcsFolderRef;
127+ private System.Windows.Forms.Button button1;
128+ private System.Windows.Forms.Button buttonTahWorkFolderRef;
129+ private System.Windows.Forms.TextBox textBoxTahWorkFolder;
130+ private System.Windows.Forms.Label label2;
131+ }
132+}
\ No newline at end of file
--- TSOSorter/Source/TextResource.Designer.cs (nonexistent)
+++ TSOSorter/Source/TextResource.Designer.cs (revision 3)
@@ -0,0 +1,2115 @@
1+//------------------------------------------------------------------------------
2+// <auto-generated>
3+// このコードはツールによって生成されました。
4+// ランタイム バージョン:2.0.50727.5477
5+//
6+// このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7+// コードが再生成されるときに損失したりします。
8+// </auto-generated>
9+//------------------------------------------------------------------------------
10+
11+namespace TSOSorter {
12+ using System;
13+
14+
15+ /// <summary>
16+ /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17+ /// </summary>
18+ // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19+ // または Visual Studio のようなツールを使用して自動生成されました。
20+ // メンバを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21+ // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
22+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
23+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25+ public class TextResource {
26+
27+ private static global::System.Resources.ResourceManager resourceMan;
28+
29+ private static global::System.Globalization.CultureInfo resourceCulture;
30+
31+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32+ internal TextResource() {
33+ }
34+
35+ /// <summary>
36+ /// このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
37+ /// </summary>
38+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39+ public static global::System.Resources.ResourceManager ResourceManager {
40+ get {
41+ if (object.ReferenceEquals(resourceMan, null)) {
42+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TSOSorter.TextResource", typeof(TextResource).Assembly);
43+ resourceMan = temp;
44+ }
45+ return resourceMan;
46+ }
47+ }
48+
49+ /// <summary>
50+ /// 厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
51+ /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
52+ /// </summary>
53+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54+ public static global::System.Globalization.CultureInfo Culture {
55+ get {
56+ return resourceCulture;
57+ }
58+ set {
59+ resourceCulture = value;
60+ }
61+ }
62+
63+ /// <summary>
64+ /// 3DCG Mods Reference Serverにアクセスする に類似しているローカライズされた文字列を検索します。
65+ /// </summary>
66+ public static string AccessModsRefServer {
67+ get {
68+ return ResourceManager.GetString("AccessModsRefServer", resourceCulture);
69+ }
70+ }
71+
72+ /// <summary>
73+ /// 新規タブで表示する に類似しているローカライズされた文字列を検索します。
74+ /// </summary>
75+ public static string AlwaysNewTab {
76+ get {
77+ return ResourceManager.GetString("AlwaysNewTab", resourceCulture);
78+ }
79+ }
80+
81+ /// <summary>
82+ /// ZIP展開時にフォルダを表示する に類似しているローカライズされた文字列を検索します。
83+ /// </summary>
84+ public static string AlwaysOpenFolderByExtract {
85+ get {
86+ return ResourceManager.GetString("AlwaysOpenFolderByExtract", resourceCulture);
87+ }
88+ }
89+
90+ /// <summary>
91+ /// 書庫 に類似しているローカライズされた文字列を検索します。
92+ /// </summary>
93+ public static string Archive {
94+ get {
95+ return ResourceManager.GetString("Archive", resourceCulture);
96+ }
97+ }
98+
99+ /// <summary>
100+ /// archiveがnullになりました に類似しているローカライズされた文字列を検索します。
101+ /// </summary>
102+ public static string ArchiveIsNull {
103+ get {
104+ return ResourceManager.GetString("ArchiveIsNull", resourceCulture);
105+ }
106+ }
107+
108+ /// <summary>
109+ /// アーカイブが見つかりません に類似しているローカライズされた文字列を検索します。
110+ /// </summary>
111+ public static string ArchiveNotFound {
112+ get {
113+ return ResourceManager.GetString("ArchiveNotFound", resourceCulture);
114+ }
115+ }
116+
117+ /// <summary>
118+ /// ARCSディレクトリ に類似しているローカライズされた文字列を検索します。
119+ /// </summary>
120+ public static string ArcsDirectory {
121+ get {
122+ return ResourceManager.GetString("ArcsDirectory", resourceCulture);
123+ }
124+ }
125+
126+ /// <summary>
127+ /// arcnames server に類似しているローカライズされた文字列を検索します。
128+ /// </summary>
129+ public static string ArcsNameServer {
130+ get {
131+ return ResourceManager.GetString("ArcsNameServer", resourceCulture);
132+ }
133+ }
134+
135+ /// <summary>
136+ /// Arcs に類似しているローカライズされた文字列を検索します。
137+ /// </summary>
138+ public static string ArcsTabName {
139+ get {
140+ return ResourceManager.GetString("ArcsTabName", resourceCulture);
141+ }
142+ }
143+
144+ /// <summary>
145+ /// base.tahの読み込みでエラーが発生しました。 に類似しているローカライズされた文字列を検索します。
146+ /// </summary>
147+ public static string BaseTahReadError {
148+ get {
149+ return ResourceManager.GetString("BaseTahReadError", resourceCulture);
150+ }
151+ }
152+
153+ /// <summary>
154+ /// カメラ に類似しているローカライズされた文字列を検索します。
155+ /// </summary>
156+ public static string Camera {
157+ get {
158+ return ResourceManager.GetString("Camera", resourceCulture);
159+ }
160+ }
161+
162+ /// <summary>
163+ /// カメラ設定 に類似しているローカライズされた文字列を検索します。
164+ /// </summary>
165+ public static string CameraAutoCenter {
166+ get {
167+ return ResourceManager.GetString("CameraAutoCenter", resourceCulture);
168+ }
169+ }
170+
171+ /// <summary>
172+ /// 回転中心 に類似しているローカライズされた文字列を検索します。
173+ /// </summary>
174+ public static string CameraCenter {
175+ get {
176+ return ResourceManager.GetString("CameraCenter", resourceCulture);
177+ }
178+ }
179+
180+ /// <summary>
181+ /// 初期視点 に類似しているローカライズされた文字列を検索します。
182+ /// </summary>
183+ public static string CameraTransition {
184+ get {
185+ return ResourceManager.GetString("CameraTransition", resourceCulture);
186+ }
187+ }
188+
189+ /// <summary>
190+ /// 種類 に類似しているローカライズされた文字列を検索します。
191+ /// </summary>
192+ public static string Category {
193+ get {
194+ return ResourceManager.GetString("Category", resourceCulture);
195+ }
196+ }
197+
198+ /// <summary>
199+ /// 閉じる に類似しているローカライズされた文字列を検索します。
200+ /// </summary>
201+ public static string Close {
202+ get {
203+ return ResourceManager.GetString("Close", resourceCulture);
204+ }
205+ }
206+
207+ /// <summary>
208+ /// タブを閉じる に類似しているローカライズされた文字列を検索します。
209+ /// </summary>
210+ public static string CloseTab {
211+ get {
212+ return ResourceManager.GetString("CloseTab", resourceCulture);
213+ }
214+ }
215+
216+ /// <summary>
217+ /// コード に類似しているローカライズされた文字列を検索します。
218+ /// </summary>
219+ public static string Code {
220+ get {
221+ return ResourceManager.GetString("Code", resourceCulture);
222+ }
223+ }
224+
225+ /// <summary>
226+ /// 衝突検出 に類似しているローカライズされた文字列を検索します。
227+ /// </summary>
228+ public static string CollisionDetection {
229+ get {
230+ return ResourceManager.GetString("CollisionDetection", resourceCulture);
231+ }
232+ }
233+
234+ /// <summary>
235+ /// 衝突先TAH に類似しているローカライズされた文字列を検索します。
236+ /// </summary>
237+ public static string CollisionedTAH {
238+ get {
239+ return ResourceManager.GetString("CollisionedTAH", resourceCulture);
240+ }
241+ }
242+
243+ /// <summary>
244+ /// 衝突元 に類似しているローカライズされた文字列を検索します。
245+ /// </summary>
246+ public static string CollisionFrom {
247+ get {
248+ return ResourceManager.GetString("CollisionFrom", resourceCulture);
249+ }
250+ }
251+
252+ /// <summary>
253+ /// 衝突したtah に類似しているローカライズされた文字列を検索します。
254+ /// </summary>
255+ public static string CollisionHTML_CollisionFrom {
256+ get {
257+ return ResourceManager.GetString("CollisionHTML_CollisionFrom", resourceCulture);
258+ }
259+ }
260+
261+ /// <summary>
262+ /// 衝突先 に類似しているローカライズされた文字列を検索します。
263+ /// </summary>
264+ public static string CollisionHTML_CollisionTo {
265+ get {
266+ return ResourceManager.GetString("CollisionHTML_CollisionTo", resourceCulture);
267+ }
268+ }
269+
270+ /// <summary>
271+ /// 衝突 に類似しているローカライズされた文字列を検索します。
272+ /// </summary>
273+ public static string CollisionsTabName {
274+ get {
275+ return ResourceManager.GetString("CollisionsTabName", resourceCulture);
276+ }
277+ }
278+
279+ /// <summary>
280+ /// 衝突先 に類似しているローカライズされた文字列を検索します。
281+ /// </summary>
282+ public static string CollisionTo {
283+ get {
284+ return ResourceManager.GetString("CollisionTo", resourceCulture);
285+ }
286+ }
287+
288+ /// <summary>
289+ /// 梱包完了 に類似しているローカライズされた文字列を検索します。
290+ /// </summary>
291+ public static string CompressComplete {
292+ get {
293+ return ResourceManager.GetString("CompressComplete", resourceCulture);
294+ }
295+ }
296+
297+ /// <summary>
298+ /// 梱包中 に類似しているローカライズされた文字列を検索します。
299+ /// </summary>
300+ public static string Compressing {
301+ get {
302+ return ResourceManager.GetString("Compressing", resourceCulture);
303+ }
304+ }
305+
306+ /// <summary>
307+ /// データベース に類似しているローカライズされた文字列を検索します。
308+ /// </summary>
309+ public static string DataBaseMenu {
310+ get {
311+ return ResourceManager.GetString("DataBaseMenu", resourceCulture);
312+ }
313+ }
314+
315+ /// <summary>
316+ /// データベース設定 に類似しているローカライズされた文字列を検索します。
317+ /// </summary>
318+ public static string DatabaseSetting {
319+ get {
320+ return ResourceManager.GetString("DatabaseSetting", resourceCulture);
321+ }
322+ }
323+
324+ /// <summary>
325+ /// データベースの構築・更新 に類似しているローカライズされた文字列を検索します。
326+ /// </summary>
327+ public static string DataBaseUpdate {
328+ get {
329+ return ResourceManager.GetString("DataBaseUpdate", resourceCulture);
330+ }
331+ }
332+
333+ /// <summary>
334+ /// 日時 に類似しているローカライズされた文字列を検索します。
335+ /// </summary>
336+ public static string DateTime {
337+ get {
338+ return ResourceManager.GetString("DateTime", resourceCulture);
339+ }
340+ }
341+
342+ /// <summary>
343+ /// dbファイルの削除ができませんでした。手動で削除して下さい。 に類似しているローカライズされた文字列を検索します。
344+ /// </summary>
345+ public static string DBFileDeleteError {
346+ get {
347+ return ResourceManager.GetString("DBFileDeleteError", resourceCulture);
348+ }
349+ }
350+
351+ /// <summary>
352+ /// tahバージョン違いは衝突とみなさない に類似しているローカライズされた文字列を検索します。
353+ /// </summary>
354+ public static string DifferVersionTah {
355+ get {
356+ return ResourceManager.GetString("DifferVersionTah", resourceCulture);
357+ }
358+ }
359+
360+ /// <summary>
361+ /// ディレクトリ に類似しているローカライズされた文字列を検索します。
362+ /// </summary>
363+ public static string Directory {
364+ get {
365+ return ResourceManager.GetString("Directory", resourceCulture);
366+ }
367+ }
368+
369+ /// <summary>
370+ /// TSOビューワにポーズを表示する に類似しているローカライズされた文字列を検索します。
371+ /// </summary>
372+ public static string DisplayPoseTSOView {
373+ get {
374+ return ResourceManager.GetString("DisplayPoseTSOView", resourceCulture);
375+ }
376+ }
377+
378+ /// <summary>
379+ /// TSOビューに表示する に類似しているローカライズされた文字列を検索します。
380+ /// </summary>
381+ public static string DisplayTSOView {
382+ get {
383+ return ResourceManager.GetString("DisplayTSOView", resourceCulture);
384+ }
385+ }
386+
387+ /// <summary>
388+ /// 最新の情報を表示 に類似しているローカライズされた文字列を検索します。
389+ /// </summary>
390+ public static string DisplayUpdate {
391+ get {
392+ return ResourceManager.GetString("DisplayUpdate", resourceCulture);
393+ }
394+ }
395+
396+ /// <summary>
397+ /// データベースからのダウンロード に類似しているローカライズされた文字列を検索します。
398+ /// </summary>
399+ public static string DownloadCaption {
400+ get {
401+ return ResourceManager.GetString("DownloadCaption", resourceCulture);
402+ }
403+ }
404+
405+ /// <summary>
406+ /// 最新のデータベース情報を取得 に類似しているローカライズされた文字列を検索します。
407+ /// </summary>
408+ public static string DownloadLatestArcsnameszip {
409+ get {
410+ return ResourceManager.GetString("DownloadLatestArcsnameszip", resourceCulture);
411+ }
412+ }
413+
414+ /// <summary>
415+ /// 注訳を入力... に類似しているローカライズされた文字列を検索します。
416+ /// </summary>
417+ public static string EditAnnotation {
418+ get {
419+ return ResourceManager.GetString("EditAnnotation", resourceCulture);
420+ }
421+ }
422+
423+ /// <summary>
424+ /// 注訳の入力 に類似しているローカライズされた文字列を検索します。
425+ /// </summary>
426+ public static string EditAnnotationText {
427+ get {
428+ return ResourceManager.GetString("EditAnnotationText", resourceCulture);
429+ }
430+ }
431+
432+ /// <summary>
433+ /// 初期設定 に類似しているローカライズされた文字列を検索します。
434+ /// </summary>
435+ public static string EditConfiguration {
436+ get {
437+ return ResourceManager.GetString("EditConfiguration", resourceCulture);
438+ }
439+ }
440+
441+ /// <summary>
442+ /// 編集中 に類似しているローカライズされた文字列を検索します。
443+ /// </summary>
444+ public static string Editing {
445+ get {
446+ return ResourceManager.GetString("Editing", resourceCulture);
447+ }
448+ }
449+
450+ /// <summary>
451+ /// 初期設定 に類似しているローカライズされた文字列を検索します。
452+ /// </summary>
453+ public static string EditSystemDatabase {
454+ get {
455+ return ResourceManager.GetString("EditSystemDatabase", resourceCulture);
456+ }
457+ }
458+
459+ /// <summary>
460+ /// TAHファイルを編集する に類似しているローカライズされた文字列を検索します。
461+ /// </summary>
462+ public static string EditTahFile {
463+ get {
464+ return ResourceManager.GetString("EditTahFile", resourceCulture);
465+ }
466+ }
467+
468+ /// <summary>
469+ /// エラー に類似しているローカライズされた文字列を検索します。
470+ /// </summary>
471+ public static string Error {
472+ get {
473+ return ResourceManager.GetString("Error", resourceCulture);
474+ }
475+ }
476+
477+ /// <summary>
478+ /// 終了 に類似しているローカライズされた文字列を検索します。
479+ /// </summary>
480+ public static string Exit {
481+ get {
482+ return ResourceManager.GetString("Exit", resourceCulture);
483+ }
484+ }
485+
486+ /// <summary>
487+ /// ツリーを展開 に類似しているローカライズされた文字列を検索します。
488+ /// </summary>
489+ public static string ExpandTree {
490+ get {
491+ return ResourceManager.GetString("ExpandTree", resourceCulture);
492+ }
493+ }
494+
495+ /// <summary>
496+ /// ファイルの展開に失敗しました に類似しているローカライズされた文字列を検索します。
497+ /// </summary>
498+ public static string ExtractFailure {
499+ get {
500+ return ResourceManager.GetString("ExtractFailure", resourceCulture);
501+ }
502+ }
503+
504+ /// <summary>
505+ /// 展開失敗 に類似しているローカライズされた文字列を検索します。
506+ /// </summary>
507+ public static string ExtractFailureCaption {
508+ get {
509+ return ResourceManager.GetString("ExtractFailureCaption", resourceCulture);
510+ }
511+ }
512+
513+ /// <summary>
514+ /// 展開中 に類似しているローカライズされた文字列を検索します。
515+ /// </summary>
516+ public static string Extracting {
517+ get {
518+ return ResourceManager.GetString("Extracting", resourceCulture);
519+ }
520+ }
521+
522+ /// <summary>
523+ /// ファイルを展開しました に類似しているローカライズされた文字列を検索します。
524+ /// </summary>
525+ public static string ExtractSuccess {
526+ get {
527+ return ResourceManager.GetString("ExtractSuccess", resourceCulture);
528+ }
529+ }
530+
531+ /// <summary>
532+ /// 展開成功 に類似しているローカライズされた文字列を検索します。
533+ /// </summary>
534+ public static string ExtractSuccessCaption {
535+ get {
536+ return ResourceManager.GetString("ExtractSuccessCaption", resourceCulture);
537+ }
538+ }
539+
540+ /// <summary>
541+ /// TAHファイルを展開する に類似しているローカライズされた文字列を検索します。
542+ /// </summary>
543+ public static string ExtractTahFile {
544+ get {
545+ return ResourceManager.GetString("ExtractTahFile", resourceCulture);
546+ }
547+ }
548+
549+ /// <summary>
550+ /// アーカイブファイルの展開 に類似しているローカライズされた文字列を検索します。
551+ /// </summary>
552+ public static string ExtractZipFile {
553+ get {
554+ return ResourceManager.GetString("ExtractZipFile", resourceCulture);
555+ }
556+ }
557+
558+ /// <summary>
559+ /// フィギュア に類似しているローカライズされた文字列を検索します。
560+ /// </summary>
561+ public static string Figure {
562+ get {
563+ return ResourceManager.GetString("Figure", resourceCulture);
564+ }
565+ }
566+
567+ /// <summary>
568+ /// ファイル に類似しているローカライズされた文字列を検索します。
569+ /// </summary>
570+ public static string FileMenu {
571+ get {
572+ return ResourceManager.GetString("FileMenu", resourceCulture);
573+ }
574+ }
575+
576+ /// <summary>
577+ /// ファイル名 に類似しているローカライズされた文字列を検索します。
578+ /// </summary>
579+ public static string Filename {
580+ get {
581+ return ResourceManager.GetString("Filename", resourceCulture);
582+ }
583+ }
584+
585+ /// <summary>
586+ /// ファイルの読み取りでエラーが発生しました。 に類似しているローカライズされた文字列を検索します。
587+ /// </summary>
588+ public static string FileReadError {
589+ get {
590+ return ResourceManager.GetString("FileReadError", resourceCulture);
591+ }
592+ }
593+
594+ /// <summary>
595+ /// ファイル読み取り中 に類似しているローカライズされた文字列を検索します。
596+ /// </summary>
597+ public static string FileReading {
598+ get {
599+ return ResourceManager.GetString("FileReading", resourceCulture);
600+ }
601+ }
602+
603+ /// <summary>
604+ /// ファイルサイズ に類似しているローカライズされた文字列を検索します。
605+ /// </summary>
606+ public static string FileSize {
607+ get {
608+ return ResourceManager.GetString("FileSize", resourceCulture);
609+ }
610+ }
611+
612+ /// <summary>
613+ /// ファイルタイプ に類似しているローカライズされた文字列を検索します。
614+ /// </summary>
615+ public static string FileType {
616+ get {
617+ return ResourceManager.GetString("FileType", resourceCulture);
618+ }
619+ }
620+
621+ /// <summary>
622+ /// ファイルが使用中です。 に類似しているローカライズされた文字列を検索します。
623+ /// </summary>
624+ public static string FileUsed {
625+ get {
626+ return ResourceManager.GetString("FileUsed", resourceCulture);
627+ }
628+ }
629+
630+ /// <summary>
631+ /// 前提TAHを検索する に類似しているローカライズされた文字列を検索します。
632+ /// </summary>
633+ public static string FindNoBaseMod {
634+ get {
635+ return ResourceManager.GetString("FindNoBaseMod", resourceCulture);
636+ }
637+ }
638+
639+ /// <summary>
640+ /// 検索された前提アーカイブファイル に類似しているローカライズされた文字列を検索します。
641+ /// </summary>
642+ public static string FoundStrayArchive {
643+ get {
644+ return ResourceManager.GetString("FoundStrayArchive", resourceCulture);
645+ }
646+ }
647+
648+ /// <summary>
649+ /// 前提TAH検索 に類似しているローカライズされた文字列を検索します。
650+ /// </summary>
651+ public static string FoundStrayTAH {
652+ get {
653+ return ResourceManager.GetString("FoundStrayTAH", resourceCulture);
654+ }
655+ }
656+
657+ /// <summary>
658+ /// ハッシュコード に類似しているローカライズされた文字列を検索します。
659+ /// </summary>
660+ public static string HashCode {
661+ get {
662+ return ResourceManager.GetString("HashCode", resourceCulture);
663+ }
664+ }
665+
666+ /// <summary>
667+ /// ヘルプ に類似しているローカライズされた文字列を検索します。
668+ /// </summary>
669+ public static string HelpMenu {
670+ get {
671+ return ResourceManager.GetString("HelpMenu", resourceCulture);
672+ }
673+ }
674+
675+ /// <summary>
676+ /// インターネットへのアクセスに失敗しました に類似しているローカライズされた文字列を検索します。
677+ /// </summary>
678+ public static string HttpError {
679+ get {
680+ return ResourceManager.GetString("HttpError", resourceCulture);
681+ }
682+ }
683+
684+ /// <summary>
685+ /// インストール済み に類似しているローカライズされた文字列を検索します。
686+ /// </summary>
687+ public static string InstalledModsTabName {
688+ get {
689+ return ResourceManager.GetString("InstalledModsTabName", resourceCulture);
690+ }
691+ }
692+
693+ /// <summary>
694+ /// 前提アーカイブファイルを展開 に類似しているローカライズされた文字列を検索します。
695+ /// </summary>
696+ public static string InstallPreferredMods {
697+ get {
698+ return ResourceManager.GetString("InstallPreferredMods", resourceCulture);
699+ }
700+ }
701+
702+ /// <summary>
703+ /// ライト に類似しているローカライズされた文字列を検索します。
704+ /// </summary>
705+ public static string Light {
706+ get {
707+ return ResourceManager.GetString("Light", resourceCulture);
708+ }
709+ }
710+
711+ /// <summary>
712+ /// 常に3DCG Mods Reference Serverから最新情報を取得する に類似しているローカライズされた文字列を検索します。
713+ /// </summary>
714+ public static string LookupModRefServer {
715+ get {
716+ return ResourceManager.GetString("LookupModRefServer", resourceCulture);
717+ }
718+ }
719+
720+ /// <summary>
721+ /// ダミーTAHファイルの作成 に類似しているローカライズされた文字列を検索します。
722+ /// </summary>
723+ public static string MakeDummyTAH {
724+ get {
725+ return ResourceManager.GetString("MakeDummyTAH", resourceCulture);
726+ }
727+ }
728+
729+ /// <summary>
730+ /// ヘビーセーブ形式で保存する に類似しているローカライズされた文字列を検索します。
731+ /// </summary>
732+ public static string MakeHeavySaveFile {
733+ get {
734+ return ResourceManager.GetString("MakeHeavySaveFile", resourceCulture);
735+ }
736+ }
737+
738+ /// <summary>
739+ /// TAHファイルを作成する に類似しているローカライズされた文字列を検索します。
740+ /// </summary>
741+ public static string MakeTAHFile {
742+ get {
743+ return ResourceManager.GetString("MakeTAHFile", resourceCulture);
744+ }
745+ }
746+
747+ /// <summary>
748+ /// tbnファイルの生成 に類似しているローカライズされた文字列を検索します。
749+ /// </summary>
750+ public static string MakeTbnDialogText {
751+ get {
752+ return ResourceManager.GetString("MakeTbnDialogText", resourceCulture);
753+ }
754+ }
755+
756+ /// <summary>
757+ /// サムネイルを作成する に類似しているローカライズされた文字列を検索します。
758+ /// </summary>
759+ public static string MakeThumbnail {
760+ get {
761+ return ResourceManager.GetString("MakeThumbnail", resourceCulture);
762+ }
763+ }
764+
765+ /// <summary>
766+ /// http://3dcustom.ath.cx/TDCGExplorer/manual.html に類似しているローカライズされた文字列を検索します。
767+ /// </summary>
768+ public static string MODRefServerUrl {
769+ get {
770+ return ResourceManager.GetString("MODRefServerUrl", resourceCulture);
771+ }
772+ }
773+
774+ /// <summary>
775+ /// MOD正規表現 に類似しているローカライズされた文字列を検索します。
776+ /// </summary>
777+ public static string MODRegExp {
778+ get {
779+ return ResourceManager.GetString("MODRegExp", resourceCulture);
780+ }
781+ }
782+
783+ /// <summary>
784+ /// mod ref. server に類似しているローカライズされた文字列を検索します。
785+ /// </summary>
786+ public static string ModsRefServer {
787+ get {
788+ return ResourceManager.GetString("ModsRefServer", resourceCulture);
789+ }
790+ }
791+
792+ /// <summary>
793+ /// 新しいタブを開く に類似しているローカライズされた文字列を検索します。
794+ /// </summary>
795+ public static string NewTab {
796+ get {
797+ return ResourceManager.GetString("NewTab", resourceCulture);
798+ }
799+ }
800+
801+ /// <summary>
802+ /// 新しいTab に類似しているローカライズされた文字列を検索します。
803+ /// </summary>
804+ public static string NewTabCaption {
805+ get {
806+ return ResourceManager.GetString("NewTabCaption", resourceCulture);
807+ }
808+ }
809+
810+ /// <summary>
811+ /// 何もしない に類似しているローカライズされた文字列を検索します。
812+ /// </summary>
813+ public static string Nothing {
814+ get {
815+ return ResourceManager.GetString("Nothing", resourceCulture);
816+ }
817+ }
818+
819+ /// <summary>
820+ /// この操作はTAHディレクトリのみ実行できます に類似しているローカライズされた文字列を検索します。
821+ /// </summary>
822+ public static string OnlyTAHDirectory {
823+ get {
824+ return ResourceManager.GetString("OnlyTAHDirectory", resourceCulture);
825+ }
826+ }
827+
828+ /// <summary>
829+ /// この操作はTAHファイルのみ実行できます に類似しているローカライズされた文字列を検索します。
830+ /// </summary>
831+ public static string OnlyTAHFile {
832+ get {
833+ return ResourceManager.GetString("OnlyTAHFile", resourceCulture);
834+ }
835+ }
836+
837+ /// <summary>
838+ /// この操作はTMOにのみ実行できます に類似しているローカライズされた文字列を検索します。
839+ /// </summary>
840+ public static string OnlyTMOFile {
841+ get {
842+ return ResourceManager.GetString("OnlyTMOFile", resourceCulture);
843+ }
844+ }
845+
846+ /// <summary>
847+ /// この操作はTSOにのみ実行できます に類似しているローカライズされた文字列を検索します。
848+ /// </summary>
849+ public static string OnlyTSOFile {
850+ get {
851+ return ResourceManager.GetString("OnlyTSOFile", resourceCulture);
852+ }
853+ }
854+
855+ /// <summary>
856+ /// 選択されている階層以下のTAHをエディタで開く に類似しているローカライズされた文字列を検索します。
857+ /// </summary>
858+ public static string OpenAllTAH {
859+ get {
860+ return ResourceManager.GetString("OpenAllTAH", resourceCulture);
861+ }
862+ }
863+
864+ /// <summary>
865+ /// アーカイブ展開フォルダを開く に類似しているローカライズされた文字列を検索します。
866+ /// </summary>
867+ public static string OpenArchive {
868+ get {
869+ return ResourceManager.GetString("OpenArchive", resourceCulture);
870+ }
871+ }
872+
873+ /// <summary>
874+ /// フォルダを開く に類似しているローカライズされた文字列を検索します。
875+ /// </summary>
876+ public static string OpenFolder {
877+ get {
878+ return ResourceManager.GetString("OpenFolder", resourceCulture);
879+ }
880+ }
881+
882+ /// <summary>
883+ /// 最初に見つけた画像もしくはテキストを表示する に類似しているローカライズされた文字列を検索します。
884+ /// </summary>
885+ public static string OpenGraphicsOrText {
886+ get {
887+ return ResourceManager.GetString("OpenGraphicsOrText", resourceCulture);
888+ }
889+ }
890+
891+ /// <summary>
892+ /// 最初に見つけたテキストもしくは画像を表示する に類似しているローカライズされた文字列を検索します。
893+ /// </summary>
894+ public static string OpenTextOrGraphics {
895+ get {
896+ return ResourceManager.GetString("OpenTextOrGraphics", resourceCulture);
897+ }
898+ }
899+
900+ /// <summary>
901+ /// パーツ に類似しているローカライズされた文字列を検索します。
902+ /// </summary>
903+ public static string Parts {
904+ get {
905+ return ResourceManager.GetString("Parts", resourceCulture);
906+ }
907+ }
908+
909+ /// <summary>
910+ /// PNGファイル(*.tdcgpose.png)|*.tdcgpose.png に類似しているローカライズされた文字列を検索します。
911+ /// </summary>
912+ public static string PNGPoseFileDescription {
913+ get {
914+ return ResourceManager.GetString("PNGPoseFileDescription", resourceCulture);
915+ }
916+ }
917+
918+ /// <summary>
919+ /// PNGファイル(*.tdcgsav.png)|*.tdcgsav.png に類似しているローカライズされた文字列を検索します。
920+ /// </summary>
921+ public static string PNGSaveFileDescription {
922+ get {
923+ return ResourceManager.GetString("PNGSaveFileDescription", resourceCulture);
924+ }
925+ }
926+
927+ /// <summary>
928+ /// Poseディレクトリ に類似しているローカライズされた文字列を検索します。
929+ /// </summary>
930+ public static string PoseDirectory {
931+ get {
932+ return ResourceManager.GetString("PoseDirectory", resourceCulture);
933+ }
934+ }
935+
936+ /// <summary>
937+ /// ポーズファイル表示 に類似しているローカライズされた文字列を検索します。
938+ /// </summary>
939+ public static string PoseFileSetting {
940+ get {
941+ return ResourceManager.GetString("PoseFileSetting", resourceCulture);
942+ }
943+ }
944+
945+ /// <summary>
946+ /// ZIPを優先的に調べる に類似しているローカライズされた文字列を検索します。
947+ /// </summary>
948+ public static string PreferredZipFile {
949+ get {
950+ return ResourceManager.GetString("PreferredZipFile", resourceCulture);
951+ }
952+ }
953+
954+ /// <summary>
955+ /// 個のzipを展開しました。 に類似しているローカライズされた文字列を検索します。
956+ /// </summary>
957+ public static string PrefZip1 {
958+ get {
959+ return ResourceManager.GetString("PrefZip1", resourceCulture);
960+ }
961+ }
962+
963+ /// <summary>
964+ /// 個のzipが見つかりませんでした。 に類似しているローカライズされた文字列を検索します。
965+ /// </summary>
966+ public static string PrefZip2 {
967+ get {
968+ return ResourceManager.GetString("PrefZip2", resourceCulture);
969+ }
970+ }
971+
972+ /// <summary>
973+ /// 前提zipは全てインストール済みです に類似しているローカライズされた文字列を検索します。
974+ /// </summary>
975+ public static string PrefZip3 {
976+ get {
977+ return ResourceManager.GetString("PrefZip3", resourceCulture);
978+ }
979+ }
980+
981+ /// <summary>
982+ /// Required に類似しているローカライズされた文字列を検索します。
983+ /// </summary>
984+ public static string prefZip4 {
985+ get {
986+ return ResourceManager.GetString("prefZip4", resourceCulture);
987+ }
988+ }
989+
990+ /// <summary>
991+ /// PSDの読み込みでエラーが発生しました。 に類似しているローカライズされた文字列を検索します。
992+ /// </summary>
993+ public static string PSDFileReadError {
994+ get {
995+ return ResourceManager.GetString("PSDFileReadError", resourceCulture);
996+ }
997+ }
998+
999+ /// <summary>
1000+ /// ヘビーセーブファイルを読み直す に類似しているローカライズされた文字列を検索します。
1001+ /// </summary>
1002+ public static string ReloadHeavySaveFile {
1003+ get {
1004+ return ResourceManager.GetString("ReloadHeavySaveFile", resourceCulture);
1005+ }
1006+ }
1007+
1008+ /// <summary>
1009+ /// ファイル名を変更する に類似しているローカライズされた文字列を検索します。
1010+ /// </summary>
1011+ public static string Rename {
1012+ get {
1013+ return ResourceManager.GetString("Rename", resourceCulture);
1014+ }
1015+ }
1016+
1017+ /// <summary>
1018+ /// 描画完了... に類似しているローカライズされた文字列を検索します。
1019+ /// </summary>
1020+ public static string RenderingComplete {
1021+ get {
1022+ return ResourceManager.GetString("RenderingComplete", resourceCulture);
1023+ }
1024+ }
1025+
1026+ /// <summary>
1027+ /// 描画中... に類似しているローカライズされた文字列を検索します。
1028+ /// </summary>
1029+ public static string RenderingNow {
1030+ get {
1031+ return ResourceManager.GetString("RenderingNow", resourceCulture);
1032+ }
1033+ }
1034+
1035+ /// <summary>
1036+ /// 関連アーカイブを調べる に類似しているローカライズされた文字列を検索します。
1037+ /// </summary>
1038+ public static string ResearchAssumptionArchive {
1039+ get {
1040+ return ResourceManager.GetString("ResearchAssumptionArchive", resourceCulture);
1041+ }
1042+ }
1043+
1044+ /// <summary>
1045+ /// ビューワをリセット に類似しているローカライズされた文字列を検索します。
1046+ /// </summary>
1047+ public static string ResetTsoViwer {
1048+ get {
1049+ return ResourceManager.GetString("ResetTsoViwer", resourceCulture);
1050+ }
1051+ }
1052+
1053+ /// <summary>
1054+ /// ファイル名が一致する物も衝突とみなす に類似しているローカライズされた文字列を検索します。
1055+ /// </summary>
1056+ public static string SameFileIsCollisioned {
1057+ get {
1058+ return ResourceManager.GetString("SameFileIsCollisioned", resourceCulture);
1059+ }
1060+ }
1061+
1062+ /// <summary>
1063+ /// ファイル保存中 に類似しているローカライズされた文字列を検索します。
1064+ /// </summary>
1065+ public static string SaveFile {
1066+ get {
1067+ return ResourceManager.GetString("SaveFile", resourceCulture);
1068+ }
1069+ }
1070+
1071+ /// <summary>
1072+ /// 乳 に類似しているローカライズされた文字列を検索します。
1073+ /// </summary>
1074+ public static string SaveFileParam0 {
1075+ get {
1076+ return ResourceManager.GetString("SaveFileParam0", resourceCulture);
1077+ }
1078+ }
1079+
1080+ /// <summary>
1081+ /// 姉&妹 に類似しているローカライズされた文字列を検索します。
1082+ /// </summary>
1083+ public static string SaveFileParam1 {
1084+ get {
1085+ return ResourceManager.GetString("SaveFileParam1", resourceCulture);
1086+ }
1087+ }
1088+
1089+ /// <summary>
1090+ /// 二の腕 に類似しているローカライズされた文字列を検索します。
1091+ /// </summary>
1092+ public static string SaveFileParam2 {
1093+ get {
1094+ return ResourceManager.GetString("SaveFileParam2", resourceCulture);
1095+ }
1096+ }
1097+
1098+ /// <summary>
1099+ /// 太もも に類似しているローカライズされた文字列を検索します。
1100+ /// </summary>
1101+ public static string SaveFileParam3 {
1102+ get {
1103+ return ResourceManager.GetString("SaveFileParam3", resourceCulture);
1104+ }
1105+ }
1106+
1107+ /// <summary>
1108+ /// ウエスト に類似しているローカライズされた文字列を検索します。
1109+ /// </summary>
1110+ public static string SaveFileParam4 {
1111+ get {
1112+ return ResourceManager.GetString("SaveFileParam4", resourceCulture);
1113+ }
1114+ }
1115+
1116+ /// <summary>
1117+ /// ツリ眼たれ眼 に類似しているローカライズされた文字列を検索します。
1118+ /// </summary>
1119+ public static string SaveFileParam5 {
1120+ get {
1121+ return ResourceManager.GetString("SaveFileParam5", resourceCulture);
1122+ }
1123+ }
1124+
1125+ /// <summary>
1126+ /// やわらか に類似しているローカライズされた文字列を検索します。
1127+ /// </summary>
1128+ public static string SaveFileParam6 {
1129+ get {
1130+ return ResourceManager.GetString("SaveFileParam6", resourceCulture);
1131+ }
1132+ }
1133+
1134+ /// <summary>
1135+ /// セーブファイル に類似しているローカライズされた文字列を検索します。
1136+ /// </summary>
1137+ public static string SaveFilesTabName {
1138+ get {
1139+ return ResourceManager.GetString("SaveFilesTabName", resourceCulture);
1140+ }
1141+ }
1142+
1143+ /// <summary>
1144+ /// セーブファイルビューア に類似しているローカライズされた文字列を検索します。
1145+ /// </summary>
1146+ public static string SaveFileViewer {
1147+ get {
1148+ return ResourceManager.GetString("SaveFileViewer", resourceCulture);
1149+ }
1150+ }
1151+
1152+ /// <summary>
1153+ /// TAH形式の保存 に類似しているローカライズされた文字列を検索します。
1154+ /// </summary>
1155+ public static string SaveTAHFile {
1156+ get {
1157+ return ResourceManager.GetString("SaveTAHFile", resourceCulture);
1158+ }
1159+ }
1160+
1161+ /// <summary>
1162+ /// 選択されたtmoファイルを保存する に類似しているローカライズされた文字列を検索します。
1163+ /// </summary>
1164+ public static string SaveTMOFile {
1165+ get {
1166+ return ResourceManager.GetString("SaveTMOFile", resourceCulture);
1167+ }
1168+ }
1169+
1170+ /// <summary>
1171+ /// 検索... に類似しているローカライズされた文字列を検索します。
1172+ /// </summary>
1173+ public static string Search {
1174+ get {
1175+ return ResourceManager.GetString("Search", resourceCulture);
1176+ }
1177+ }
1178+
1179+ /// <summary>
1180+ /// 検索完了。行をダブルクリックすると、そのファイルにジャンプします。 に類似しているローカライズされた文字列を検索します。
1181+ /// </summary>
1182+ public static string SearchComplete {
1183+ get {
1184+ return ResourceManager.GetString("SearchComplete", resourceCulture);
1185+ }
1186+ }
1187+
1188+ /// <summary>
1189+ /// 検索文字列 に類似しているローカライズされた文字列を検索します。
1190+ /// </summary>
1191+ public static string SearchDialogLabel {
1192+ get {
1193+ return ResourceManager.GetString("SearchDialogLabel", resourceCulture);
1194+ }
1195+ }
1196+
1197+ /// <summary>
1198+ /// 検索 に類似しているローカライズされた文字列を検索します。
1199+ /// </summary>
1200+ public static string SearchDialogText {
1201+ get {
1202+ return ResourceManager.GetString("SearchDialogText", resourceCulture);
1203+ }
1204+ }
1205+
1206+ /// <summary>
1207+ /// 検索中 に類似しているローカライズされた文字列を検索します。
1208+ /// </summary>
1209+ public static string Searching {
1210+ get {
1211+ return ResourceManager.GetString("Searching", resourceCulture);
1212+ }
1213+ }
1214+
1215+ /// <summary>
1216+ /// 検索 に類似しているローカライズされた文字列を検索します。
1217+ /// </summary>
1218+ public static string SearchText {
1219+ get {
1220+ return ResourceManager.GetString("SearchText", resourceCulture);
1221+ }
1222+ }
1223+
1224+ /// <summary>
1225+ /// アーカイブも検索する に類似しているローカライズされた文字列を検索します。
1226+ /// </summary>
1227+ public static string SearchWithZipFile {
1228+ get {
1229+ return ResourceManager.GetString("SearchWithZipFile", resourceCulture);
1230+ }
1231+ }
1232+
1233+ /// <summary>
1234+ /// 全て選択 に類似しているローカライズされた文字列を検索します。
1235+ /// </summary>
1236+ public static string SelectAll {
1237+ get {
1238+ return ResourceManager.GetString("SelectAll", resourceCulture);
1239+ }
1240+ }
1241+
1242+ /// <summary>
1243+ /// 保存先のファイルを選択してください に類似しているローカライズされた文字列を検索します。
1244+ /// </summary>
1245+ public static string SelectSaveFileName {
1246+ get {
1247+ return ResourceManager.GetString("SelectSaveFileName", resourceCulture);
1248+ }
1249+ }
1250+
1251+ /// <summary>
1252+ /// マニュアルの表示 に類似しているローカライズされた文字列を検索します。
1253+ /// </summary>
1254+ public static string ShowManual {
1255+ get {
1256+ return ResourceManager.GetString("ShowManual", resourceCulture);
1257+ }
1258+ }
1259+
1260+ /// <summary>
1261+ /// TSOプレビューを表示する に類似しているローカライズされた文字列を検索します。
1262+ /// </summary>
1263+ public static string ShowTSOPreview {
1264+ get {
1265+ return ResourceManager.GetString("ShowTSOPreview", resourceCulture);
1266+ }
1267+ }
1268+
1269+ /// <summary>
1270+ /// バージョン... に類似しているローカライズされた文字列を検索します。
1271+ /// </summary>
1272+ public static string ShowVersion {
1273+ get {
1274+ return ResourceManager.GetString("ShowVersion", resourceCulture);
1275+ }
1276+ }
1277+
1278+ /// <summary>
1279+ /// 起動時の設定 に類似しているローカライズされた文字列を検索します。
1280+ /// </summary>
1281+ public static string StartupSetting {
1282+ get {
1283+ return ResourceManager.GetString("StartupSetting", resourceCulture);
1284+ }
1285+ }
1286+
1287+ /// <summary>
1288+ /// 前提TAHが無いTAH名 に類似しているローカライズされた文字列を検索します。
1289+ /// </summary>
1290+ public static string StrayTAH {
1291+ get {
1292+ return ResourceManager.GetString("StrayTAH", resourceCulture);
1293+ }
1294+ }
1295+
1296+ /// <summary>
1297+ /// 不明なベースTBN名 に類似しているローカライズされた文字列を検索します。
1298+ /// </summary>
1299+ public static string StrayTBN {
1300+ get {
1301+ return ResourceManager.GetString("StrayTBN", resourceCulture);
1302+ }
1303+ }
1304+
1305+ /// <summary>
1306+ /// 3DCG MODS Referenceサーバから最新情報を取得しました に類似しているローカライズされた文字列を検索します。
1307+ /// </summary>
1308+ public static string SuccessModRefServer {
1309+ get {
1310+ return ResourceManager.GetString("SuccessModRefServer", resourceCulture);
1311+ }
1312+ }
1313+
1314+ /// <summary>
1315+ /// アニメーション開始 に類似しているローカライズされた文字列を検索します。
1316+ /// </summary>
1317+ public static string SwitchToMortionEnabled {
1318+ get {
1319+ return ResourceManager.GetString("SwitchToMortionEnabled", resourceCulture);
1320+ }
1321+ }
1322+
1323+ /// <summary>
1324+ /// タブブラウザ に類似しているローカライズされた文字列を検索します。
1325+ /// </summary>
1326+ public static string TabBrowser {
1327+ get {
1328+ return ResourceManager.GetString("TabBrowser", resourceCulture);
1329+ }
1330+ }
1331+
1332+ /// <summary>
1333+ /// タグ に類似しているローカライズされた文字列を検索します。
1334+ /// </summary>
1335+ public static string Tag {
1336+ get {
1337+ return ResourceManager.GetString("Tag", resourceCulture);
1338+ }
1339+ }
1340+
1341+ /// <summary>
1342+ /// tagnames server に類似しているローカライズされた文字列を検索します。
1343+ /// </summary>
1344+ public static string TagNameServer {
1345+ get {
1346+ return ResourceManager.GetString("TagNameServer", resourceCulture);
1347+ }
1348+ }
1349+
1350+ /// <summary>
1351+ /// タグ に類似しているローカライズされた文字列を検索します。
1352+ /// </summary>
1353+ public static string TagsTabName {
1354+ get {
1355+ return ResourceManager.GetString("TagsTabName", resourceCulture);
1356+ }
1357+ }
1358+
1359+ /// <summary>
1360+ /// TAHファイル展開完了 に類似しているローカライズされた文字列を検索します。
1361+ /// </summary>
1362+ public static string TAHDecryptComplete {
1363+ get {
1364+ return ResourceManager.GetString("TAHDecryptComplete", resourceCulture);
1365+ }
1366+ }
1367+
1368+ /// <summary>
1369+ /// TAHエディタ に類似しているローカライズされた文字列を検索します。
1370+ /// </summary>
1371+ public static string TAHEditor {
1372+ get {
1373+ return ResourceManager.GetString("TAHEditor", resourceCulture);
1374+ }
1375+ }
1376+
1377+ /// <summary>
1378+ /// 選択したファイルのカテゴリを変更する に類似しているローカライズされた文字列を検索します。
1379+ /// </summary>
1380+ public static string TAHEditorChangeCategory {
1381+ get {
1382+ return ResourceManager.GetString("TAHEditorChangeCategory", resourceCulture);
1383+ }
1384+ }
1385+
1386+ /// <summary>
1387+ /// 選択したファイルの色番号を変更する に類似しているローカライズされた文字列を検索します。
1388+ /// </summary>
1389+ public static string TAHEditorChangeColorCode {
1390+ get {
1391+ return ResourceManager.GetString("TAHEditorChangeColorCode", resourceCulture);
1392+ }
1393+ }
1394+
1395+ /// <summary>
1396+ /// TAH情報を変更する に類似しているローカライズされた文字列を検索します。
1397+ /// </summary>
1398+ public static string TAHEditorChangeTAHInformation {
1399+ get {
1400+ return ResourceManager.GetString("TAHEditorChangeTAHInformation", resourceCulture);
1401+ }
1402+ }
1403+
1404+ /// <summary>
1405+ /// 選択したファイルをTAHに梱包する に類似しているローカライズされた文字列を検索します。
1406+ /// </summary>
1407+ public static string TAHEditorComposeTAHFile {
1408+ get {
1409+ return ResourceManager.GetString("TAHEditorComposeTAHFile", resourceCulture);
1410+ }
1411+ }
1412+
1413+ /// <summary>
1414+ /// 選択したファイルの削除 に類似しているローカライズされた文字列を検索します。
1415+ /// </summary>
1416+ public static string TAHEditorFileDelete {
1417+ get {
1418+ return ResourceManager.GetString("TAHEditorFileDelete", resourceCulture);
1419+ }
1420+ }
1421+
1422+ /// <summary>
1423+ /// 選択したtsoファイルのtbnを生成する に類似しているローカライズされた文字列を検索します。
1424+ /// </summary>
1425+ public static string TAHEditorMakeTBN {
1426+ get {
1427+ return ResourceManager.GetString("TAHEditorMakeTBN", resourceCulture);
1428+ }
1429+ }
1430+
1431+ /// <summary>
1432+ /// 色番号は二文字で指定して下さい に類似しているローカライズされた文字列を検索します。
1433+ /// </summary>
1434+ public static string TAHEditorNewColorNoError {
1435+ get {
1436+ return ResourceManager.GetString("TAHEditorNewColorNoError", resourceCulture);
1437+ }
1438+ }
1439+
1440+ /// <summary>
1441+ /// 新しい色番号 に類似しているローカライズされた文字列を検索します。
1442+ /// </summary>
1443+ public static string TAHEditorNewColorNoLabel {
1444+ get {
1445+ return ResourceManager.GetString("TAHEditorNewColorNoLabel", resourceCulture);
1446+ }
1447+ }
1448+
1449+ /// <summary>
1450+ /// 色番号の変更 に類似しているローカライズされた文字列を検索します。
1451+ /// </summary>
1452+ public static string TAHEditorNewColorNoText {
1453+ get {
1454+ return ResourceManager.GetString("TAHEditorNewColorNoText", resourceCulture);
1455+ }
1456+ }
1457+
1458+ /// <summary>
1459+ /// TAH編集先 に類似しているローカライズされた文字列を検索します。
1460+ /// </summary>
1461+ public static string TAHEditorPlace {
1462+ get {
1463+ return ResourceManager.GetString("TAHEditorPlace", resourceCulture);
1464+ }
1465+ }
1466+
1467+ /// <summary>
1468+ /// 選択したファイルの名前を変更する に類似しているローカライズされた文字列を検索します。
1469+ /// </summary>
1470+ public static string TAHEditorRename {
1471+ get {
1472+ return ResourceManager.GetString("TAHEditorRename", resourceCulture);
1473+ }
1474+ }
1475+
1476+ /// <summary>
1477+ /// ファイル名の変更 に類似しているローカライズされた文字列を検索します。
1478+ /// </summary>
1479+ public static string TAHEditorRenameLabel {
1480+ get {
1481+ return ResourceManager.GetString("TAHEditorRenameLabel", resourceCulture);
1482+ }
1483+ }
1484+
1485+ /// <summary>
1486+ /// 新しい名前 に類似しているローカライズされた文字列を検索します。
1487+ /// </summary>
1488+ public static string TAHEditorRenameText {
1489+ get {
1490+ return ResourceManager.GetString("TAHEditorRenameText", resourceCulture);
1491+ }
1492+ }
1493+
1494+ /// <summary>
1495+ /// 選択したファイルを保存する に類似しているローカライズされた文字列を検索します。
1496+ /// </summary>
1497+ public static string TAHEditorSaveSelectedFile {
1498+ get {
1499+ return ResourceManager.GetString("TAHEditorSaveSelectedFile", resourceCulture);
1500+ }
1501+ }
1502+
1503+ /// <summary>
1504+ /// TBNの属性 に類似しているローカライズされた文字列を検索します。
1505+ /// </summary>
1506+ public static string TAHEditorTbnCatChangeLabel {
1507+ get {
1508+ return ResourceManager.GetString("TAHEditorTbnCatChangeLabel", resourceCulture);
1509+ }
1510+ }
1511+
1512+ /// <summary>
1513+ /// TBNの属性変更 に類似しているローカライズされた文字列を検索します。
1514+ /// </summary>
1515+ public static string TAHEditorTbnCatChangeText {
1516+ get {
1517+ return ResourceManager.GetString("TAHEditorTbnCatChangeText", resourceCulture);
1518+ }
1519+ }
1520+
1521+ /// <summary>
1522+ /// TAHファイル読み取り完了 に類似しているローカライズされた文字列を検索します。
1523+ /// </summary>
1524+ public static string TAHEncryptComplete {
1525+ get {
1526+ return ResourceManager.GetString("TAHEncryptComplete", resourceCulture);
1527+ }
1528+ }
1529+
1530+ /// <summary>
1531+ /// TAHファイル に類似しているローカライズされた文字列を検索します。
1532+ /// </summary>
1533+ public static string TAHFile {
1534+ get {
1535+ return ResourceManager.GetString("TAHFile", resourceCulture);
1536+ }
1537+ }
1538+
1539+ /// <summary>
1540+ /// TAHファイル(*.tah)|*.tah に類似しているローカライズされた文字列を検索します。
1541+ /// </summary>
1542+ public static string TAHFileDescription {
1543+ get {
1544+ return ResourceManager.GetString("TAHFileDescription", resourceCulture);
1545+ }
1546+ }
1547+
1548+ /// <summary>
1549+ /// tahファイルが4GBを超えます。集約するtahファイルは4GB以下にしてください。 に類似しているローカライズされた文字列を検索します。
1550+ /// </summary>
1551+ public static string TAHFileLimitError {
1552+ get {
1553+ return ResourceManager.GetString("TAHFileLimitError", resourceCulture);
1554+ }
1555+ }
1556+
1557+ /// <summary>
1558+ /// TAHファイル名 に類似しているローカライズされた文字列を検索します。
1559+ /// </summary>
1560+ public static string TAHFilename {
1561+ get {
1562+ return ResourceManager.GetString("TAHFilename", resourceCulture);
1563+ }
1564+ }
1565+
1566+ /// <summary>
1567+ /// TAHの読み取りでエラーが発生しました。 に類似しているローカライズされた文字列を検索します。
1568+ /// </summary>
1569+ public static string TAHFileReadError {
1570+ get {
1571+ return ResourceManager.GetString("TAHFileReadError", resourceCulture);
1572+ }
1573+ }
1574+
1575+ /// <summary>
1576+ /// TAHファイル読み取り中... に類似しているローカライズされた文字列を検索します。
1577+ /// </summary>
1578+ public static string TAHFileReading {
1579+ get {
1580+ return ResourceManager.GetString("TAHFileReading", resourceCulture);
1581+ }
1582+ }
1583+
1584+ /// <summary>
1585+ /// TAH内部ファイル検索... に類似しているローカライズされた文字列を検索します。
1586+ /// </summary>
1587+ public static string tahfilesearch {
1588+ get {
1589+ return ResourceManager.GetString("tahfilesearch", resourceCulture);
1590+ }
1591+ }
1592+
1593+ /// <summary>
1594+ /// TAHヘッダー情報 に類似しているローカライズされた文字列を検索します。
1595+ /// </summary>
1596+ public static string TAHInformation {
1597+ get {
1598+ return ResourceManager.GetString("TAHInformation", resourceCulture);
1599+ }
1600+ }
1601+
1602+ /// <summary>
1603+ /// TAHバージョン に類似しているローカライズされた文字列を検索します。
1604+ /// </summary>
1605+ public static string TAHVersion {
1606+ get {
1607+ return ResourceManager.GetString("TAHVersion", resourceCulture);
1608+ }
1609+ }
1610+
1611+ /// <summary>
1612+ /// tbnファイル解析中 に類似しているローカライズされた文字列を検索します。
1613+ /// </summary>
1614+ public static string TBNAnalyze {
1615+ get {
1616+ return ResourceManager.GetString("TBNAnalyze", resourceCulture);
1617+ }
1618+ }
1619+
1620+ /// <summary>
1621+ /// 0:眉 に類似しているローカライズされた文字列を検索します。
1622+ /// </summary>
1623+ public static string TbnCat0 {
1624+ get {
1625+ return ResourceManager.GetString("TbnCat0", resourceCulture);
1626+ }
1627+ }
1628+
1629+ /// <summary>
1630+ /// 1:八重歯 に類似しているローカライズされた文字列を検索します。
1631+ /// </summary>
1632+ public static string TbnCat1 {
1633+ get {
1634+ return ResourceManager.GetString("TbnCat1", resourceCulture);
1635+ }
1636+ }
1637+
1638+ /// <summary>
1639+ /// 2:ほくろ に類似しているローカライズされた文字列を検索します。
1640+ /// </summary>
1641+ public static string TbnCat2 {
1642+ get {
1643+ return ResourceManager.GetString("TbnCat2", resourceCulture);
1644+ }
1645+ }
1646+
1647+ /// <summary>
1648+ /// 3:イヤリング に類似しているローカライズされた文字列を検索します。
1649+ /// </summary>
1650+ public static string TbnCat3 {
1651+ get {
1652+ return ResourceManager.GetString("TbnCat3", resourceCulture);
1653+ }
1654+ }
1655+
1656+ /// <summary>
1657+ /// A:身体 に類似しているローカライズされた文字列を検索します。
1658+ /// </summary>
1659+ public static string TbnCatA {
1660+ get {
1661+ return ResourceManager.GetString("TbnCatA", resourceCulture);
1662+ }
1663+ }
1664+
1665+ /// <summary>
1666+ /// B:頭髪前 に類似しているローカライズされた文字列を検索します。
1667+ /// </summary>
1668+ public static string TbnCatB {
1669+ get {
1670+ return ResourceManager.GetString("TbnCatB", resourceCulture);
1671+ }
1672+ }
1673+
1674+ /// <summary>
1675+ /// C:頭髪後 に類似しているローカライズされた文字列を検索します。
1676+ /// </summary>
1677+ public static string TbnCatC {
1678+ get {
1679+ return ResourceManager.GetString("TbnCatC", resourceCulture);
1680+ }
1681+ }
1682+
1683+ /// <summary>
1684+ /// D:頭髪生え際 に類似しているローカライズされた文字列を検索します。
1685+ /// </summary>
1686+ public static string TbnCatD {
1687+ get {
1688+ return ResourceManager.GetString("TbnCatD", resourceCulture);
1689+ }
1690+ }
1691+
1692+ /// <summary>
1693+ /// E:瞳 に類似しているローカライズされた文字列を検索します。
1694+ /// </summary>
1695+ public static string TbnCatE {
1696+ get {
1697+ return ResourceManager.GetString("TbnCatE", resourceCulture);
1698+ }
1699+ }
1700+
1701+ /// <summary>
1702+ /// 背景 に類似しているローカライズされた文字列を検索します。
1703+ /// </summary>
1704+ public static string TbnCatEx0 {
1705+ get {
1706+ return ResourceManager.GetString("TbnCatEx0", resourceCulture);
1707+ }
1708+ }
1709+
1710+ /// <summary>
1711+ /// Hシーン に類似しているローカライズされた文字列を検索します。
1712+ /// </summary>
1713+ public static string TbnCatEx1 {
1714+ get {
1715+ return ResourceManager.GetString("TbnCatEx1", resourceCulture);
1716+ }
1717+ }
1718+
1719+ /// <summary>
1720+ /// F:ブラ に類似しているローカライズされた文字列を検索します。
1721+ /// </summary>
1722+ public static string TbnCatF {
1723+ get {
1724+ return ResourceManager.GetString("TbnCatF", resourceCulture);
1725+ }
1726+ }
1727+
1728+ /// <summary>
1729+ /// G:全身下着 に類似しているローカライズされた文字列を検索します。
1730+ /// </summary>
1731+ public static string TbnCatG {
1732+ get {
1733+ return ResourceManager.GetString("TbnCatG", resourceCulture);
1734+ }
1735+ }
1736+
1737+ /// <summary>
1738+ /// H:パンツ に類似しているローカライズされた文字列を検索します。
1739+ /// </summary>
1740+ public static string TbnCatH {
1741+ get {
1742+ return ResourceManager.GetString("TbnCatH", resourceCulture);
1743+ }
1744+ }
1745+
1746+ /// <summary>
1747+ /// I:靴下 に類似しているローカライズされた文字列を検索します。
1748+ /// </summary>
1749+ public static string TbnCatI {
1750+ get {
1751+ return ResourceManager.GetString("TbnCatI", resourceCulture);
1752+ }
1753+ }
1754+
1755+ /// <summary>
1756+ /// J:上着 に類似しているローカライズされた文字列を検索します。
1757+ /// </summary>
1758+ public static string TbnCatJ {
1759+ get {
1760+ return ResourceManager.GetString("TbnCatJ", resourceCulture);
1761+ }
1762+ }
1763+
1764+ /// <summary>
1765+ /// K:全身上着 に類似しているローカライズされた文字列を検索します。
1766+ /// </summary>
1767+ public static string TbnCatK {
1768+ get {
1769+ return ResourceManager.GetString("TbnCatK", resourceCulture);
1770+ }
1771+ }
1772+
1773+ /// <summary>
1774+ /// L:上着オプション に類似しているローカライズされた文字列を検索します。
1775+ /// </summary>
1776+ public static string TbnCatL {
1777+ get {
1778+ return ResourceManager.GetString("TbnCatL", resourceCulture);
1779+ }
1780+ }
1781+
1782+ /// <summary>
1783+ /// M:スカート に類似しているローカライズされた文字列を検索します。
1784+ /// </summary>
1785+ public static string TbnCatM {
1786+ get {
1787+ return ResourceManager.GetString("TbnCatM", resourceCulture);
1788+ }
1789+ }
1790+
1791+ /// <summary>
1792+ /// N:尻尾 に類似しているローカライズされた文字列を検索します。
1793+ /// </summary>
1794+ public static string TbnCatN {
1795+ get {
1796+ return ResourceManager.GetString("TbnCatN", resourceCulture);
1797+ }
1798+ }
1799+
1800+ /// <summary>
1801+ /// O:靴 に類似しているローカライズされた文字列を検索します。
1802+ /// </summary>
1803+ public static string TbnCatO {
1804+ get {
1805+ return ResourceManager.GetString("TbnCatO", resourceCulture);
1806+ }
1807+ }
1808+
1809+ /// <summary>
1810+ /// P:頭部装備 に類似しているローカライズされた文字列を検索します。
1811+ /// </summary>
1812+ public static string TbnCatP {
1813+ get {
1814+ return ResourceManager.GetString("TbnCatP", resourceCulture);
1815+ }
1816+ }
1817+
1818+ /// <summary>
1819+ /// Q:眼鏡 に類似しているローカライズされた文字列を検索します。
1820+ /// </summary>
1821+ public static string TbnCatQ {
1822+ get {
1823+ return ResourceManager.GetString("TbnCatQ", resourceCulture);
1824+ }
1825+ }
1826+
1827+ /// <summary>
1828+ /// R:首輪 に類似しているローカライズされた文字列を検索します。
1829+ /// </summary>
1830+ public static string TbnCatR {
1831+ get {
1832+ return ResourceManager.GetString("TbnCatR", resourceCulture);
1833+ }
1834+ }
1835+
1836+ /// <summary>
1837+ /// S:腕装備 に類似しているローカライズされた文字列を検索します。
1838+ /// </summary>
1839+ public static string TbnCatS {
1840+ get {
1841+ return ResourceManager.GetString("TbnCatS", resourceCulture);
1842+ }
1843+ }
1844+
1845+ /// <summary>
1846+ /// T:背中 に類似しているローカライズされた文字列を検索します。
1847+ /// </summary>
1848+ public static string TbnCatT {
1849+ get {
1850+ return ResourceManager.GetString("TbnCatT", resourceCulture);
1851+ }
1852+ }
1853+
1854+ /// <summary>
1855+ /// U:頭髪オプション に類似しているローカライズされた文字列を検索します。
1856+ /// </summary>
1857+ public static string TbnCatU {
1858+ get {
1859+ return ResourceManager.GetString("TbnCatU", resourceCulture);
1860+ }
1861+ }
1862+
1863+ /// <summary>
1864+ /// V:眼帯 に類似しているローカライズされた文字列を検索します。
1865+ /// </summary>
1866+ public static string TbnCatV {
1867+ get {
1868+ return ResourceManager.GetString("TbnCatV", resourceCulture);
1869+ }
1870+ }
1871+
1872+ /// <summary>
1873+ /// W:タイツ・ガーター に類似しているローカライズされた文字列を検索します。
1874+ /// </summary>
1875+ public static string TbnCatW {
1876+ get {
1877+ return ResourceManager.GetString("TbnCatW", resourceCulture);
1878+ }
1879+ }
1880+
1881+ /// <summary>
1882+ /// X:手首 に類似しているローカライズされた文字列を検索します。
1883+ /// </summary>
1884+ public static string TbnCatX {
1885+ get {
1886+ return ResourceManager.GetString("TbnCatX", resourceCulture);
1887+ }
1888+ }
1889+
1890+ /// <summary>
1891+ /// Y:リボン に類似しているローカライズされた文字列を検索します。
1892+ /// </summary>
1893+ public static string TbnCatY {
1894+ get {
1895+ return ResourceManager.GetString("TbnCatY", resourceCulture);
1896+ }
1897+ }
1898+
1899+ /// <summary>
1900+ /// Z:手持ち に類似しているローカライズされた文字列を検索します。
1901+ /// </summary>
1902+ public static string TbnCatZ {
1903+ get {
1904+ return ResourceManager.GetString("TbnCatZ", resourceCulture);
1905+ }
1906+ }
1907+
1908+ /// <summary>
1909+ /// tbnの読み込みでエラーが発生しました。 に類似しているローカライズされた文字列を検索します。
1910+ /// </summary>
1911+ public static string TBNReadError {
1912+ get {
1913+ return ResourceManager.GetString("TBNReadError", resourceCulture);
1914+ }
1915+ }
1916+
1917+ /// <summary>
1918+ /// TDCGディレクトリ に類似しているローカライズされた文字列を検索します。
1919+ /// </summary>
1920+ public static string TDCGDirectory {
1921+ get {
1922+ return ResourceManager.GetString("TDCGDirectory", resourceCulture);
1923+ }
1924+ }
1925+
1926+ /// <summary>
1927+ /// TMO に類似しているローカライズされた文字列を検索します。
1928+ /// </summary>
1929+ public static string TMO {
1930+ get {
1931+ return ResourceManager.GetString("TMO", resourceCulture);
1932+ }
1933+ }
1934+
1935+ /// <summary>
1936+ /// TMOファイル(*.tmo)|*.tmo に類似しているローカライズされた文字列を検索します。
1937+ /// </summary>
1938+ public static string TMOFileDescription {
1939+ get {
1940+ return ResourceManager.GetString("TMOFileDescription", resourceCulture);
1941+ }
1942+ }
1943+
1944+ /// <summary>
1945+ /// 文字数が長すぎます に類似しているローカライズされた文字列を検索します。
1946+ /// </summary>
1947+ public static string TooLongFilename {
1948+ get {
1949+ return ResourceManager.GetString("TooLongFilename", resourceCulture);
1950+ }
1951+ }
1952+
1953+ /// <summary>
1954+ /// ファイルのタイムスタンプを変更する に類似しているローカライズされた文字列を検索します。
1955+ /// </summary>
1956+ public static string Touch {
1957+ get {
1958+ return ResourceManager.GetString("Touch", resourceCulture);
1959+ }
1960+ }
1961+
1962+ /// <summary>
1963+ /// 全てのファイルの日時を変更する に類似しているローカライズされた文字列を検索します。
1964+ /// </summary>
1965+ public static string TouchAll {
1966+ get {
1967+ return ResourceManager.GetString("TouchAll", resourceCulture);
1968+ }
1969+ }
1970+
1971+ /// <summary>
1972+ /// タイムスタンプの変更 に類似しているローカライズされた文字列を検索します。
1973+ /// </summary>
1974+ public static string TouchDialogText {
1975+ get {
1976+ return ResourceManager.GetString("TouchDialogText", resourceCulture);
1977+ }
1978+ }
1979+
1980+ /// <summary>
1981+ /// TSO に類似しているローカライズされた文字列を検索します。
1982+ /// </summary>
1983+ public static string TSO {
1984+ get {
1985+ return ResourceManager.GetString("TSO", resourceCulture);
1986+ }
1987+ }
1988+
1989+ /// <summary>
1990+ /// TSO接頭辞 に類似しているローカライズされた文字列を検索します。
1991+ /// </summary>
1992+ public static string TSOHead {
1993+ get {
1994+ return ResourceManager.GetString("TSOHead", resourceCulture);
1995+ }
1996+ }
1997+
1998+ /// <summary>
1999+ /// 新規TSOロード時、カメラ設定をリセットする に類似しているローカライズされた文字列を検索します。
2000+ /// </summary>
2001+ public static string TSOLoadBehavior {
2002+ get {
2003+ return ResourceManager.GetString("TSOLoadBehavior", resourceCulture);
2004+ }
2005+ }
2006+
2007+ /// <summary>
2008+ /// tsoクリックで単体表示,ctrlキー+tsoクリックで複数表示,tmoでポーズ・アニメーションを設定 に類似しているローカライズされた文字列を検索します。
2009+ /// </summary>
2010+ public static string TSOMessage {
2011+ get {
2012+ return ResourceManager.GetString("TSOMessage", resourceCulture);
2013+ }
2014+ }
2015+
2016+ /// <summary>
2017+ /// TSOビューワ に類似しているローカライズされた文字列を検索します。
2018+ /// </summary>
2019+ public static string TSOViewerMenu {
2020+ get {
2021+ return ResourceManager.GetString("TSOViewerMenu", resourceCulture);
2022+ }
2023+ }
2024+
2025+ /// <summary>
2026+ /// arcs.dbを再圧縮する に類似しているローカライズされた文字列を検索します。
2027+ /// </summary>
2028+ public static string VacumeArcsDB {
2029+ get {
2030+ return ResourceManager.GetString("VacumeArcsDB", resourceCulture);
2031+ }
2032+ }
2033+
2034+ /// <summary>
2035+ /// ウインドウ に類似しているローカライズされた文字列を検索します。
2036+ /// </summary>
2037+ public static string WindowMenu {
2038+ get {
2039+ return ResourceManager.GetString("WindowMenu", resourceCulture);
2040+ }
2041+ }
2042+
2043+ /// <summary>
2044+ /// ZIPディレクトリ に類似しているローカライズされた文字列を検索します。
2045+ /// </summary>
2046+ public static string ZipDirectory {
2047+ get {
2048+ return ResourceManager.GetString("ZipDirectory", resourceCulture);
2049+ }
2050+ }
2051+
2052+ /// <summary>
2053+ /// ZIP展開先 に類似しているローカライズされた文字列を検索します。
2054+ /// </summary>
2055+ public static string ZipExtractLocation {
2056+ get {
2057+ return ResourceManager.GetString("ZipExtractLocation", resourceCulture);
2058+ }
2059+ }
2060+
2061+ /// <summary>
2062+ /// ZIP選択時の動作 に類似しているローカライズされた文字列を検索します。
2063+ /// </summary>
2064+ public static string ZipFileBehavior {
2065+ get {
2066+ return ResourceManager.GetString("ZipFileBehavior", resourceCulture);
2067+ }
2068+ }
2069+
2070+ /// <summary>
2071+ /// ZIP展開時の処理 に類似しているローカライズされた文字列を検索します。
2072+ /// </summary>
2073+ public static string ZipFileExtractBehavior {
2074+ get {
2075+ return ResourceManager.GetString("ZipFileExtractBehavior", resourceCulture);
2076+ }
2077+ }
2078+
2079+ /// <summary>
2080+ /// この操作は圧縮ファイルにのみ実行できます に類似しているローカライズされた文字列を検索します。
2081+ /// </summary>
2082+ public static string ZipFileOnly {
2083+ get {
2084+ return ResourceManager.GetString("ZipFileOnly", resourceCulture);
2085+ }
2086+ }
2087+
2088+ /// <summary>
2089+ /// ZIP正規表現 に類似しているローカライズされた文字列を検索します。
2090+ /// </summary>
2091+ public static string ZIPRegExp {
2092+ get {
2093+ return ResourceManager.GetString("ZIPRegExp", resourceCulture);
2094+ }
2095+ }
2096+
2097+ /// <summary>
2098+ /// アーカイブ に類似しているローカライズされた文字列を検索します。
2099+ /// </summary>
2100+ public static string ZipsTabName {
2101+ get {
2102+ return ResourceManager.GetString("ZipsTabName", resourceCulture);
2103+ }
2104+ }
2105+
2106+ /// <summary>
2107+ /// クリックで拡大縮小 に類似しているローカライズされた文字列を検索します。
2108+ /// </summary>
2109+ public static string ZoomByClick {
2110+ get {
2111+ return ResourceManager.GetString("ZoomByClick", resourceCulture);
2112+ }
2113+ }
2114+ }
2115+}
--- TSOSorter/Source/Options.cs (nonexistent)
+++ TSOSorter/Source/Options.cs (revision 3)
@@ -0,0 +1,53 @@
1+using System;
2+using System.Collections.Generic;
3+using System.ComponentModel;
4+using System.Data;
5+using System.Drawing;
6+using System.Linq;
7+using System.Text;
8+using System.Windows.Forms;
9+
10+namespace TSOSorter
11+{
12+ public partial class Options : Form
13+ {
14+ public Options()
15+ {
16+ InitializeComponent();
17+ }
18+
19+ private void buttonArcsFolderRef_Click(object sender, EventArgs e)
20+ {
21+
22+ }
23+
24+ private void buttonTahWorkFolderRef_Click(object sender, EventArgs e)
25+ {
26+
27+ }
28+
29+ private void button1_Click(object sender, EventArgs e)
30+ {
31+
32+ }
33+
34+ /** 最後の"\\"を取り除く
35+ * */
36+ private string trimdir(string dir)
37+ {
38+ if (dir.EndsWith("\\")) return dir.Substring(0, dir.Length - 1);
39+ return dir;
40+ }
41+
42+ public string m_strTextArcPath
43+ {
44+ get { return trimdir(textBoxArcsFolderPath.Text); }
45+ set { textBoxArcsFolderPath.Text = value; }
46+ }
47+ public string m_strTextTahWorkPath
48+ {
49+ get { return trimdir(textBoxTahWorkFolder.Text); }
50+ set { textBoxTahWorkFolder.Text = value; }
51+ }
52+ }
53+}
--- TSOSorter/Source/TAHViewer.cs (nonexistent)
+++ TSOSorter/Source/TAHViewer.cs (revision 3)
@@ -0,0 +1,184 @@
1+using System;
2+using System.Linq;
3+using System.Text;
4+using System.Windows.Forms;
5+using System.IO;
6+using System.Collections.Generic;
7+using System.Diagnostics;
8+using System.Data;
9+using System.Drawing;
10+using TDCGExplorer;
11+using System.Data.SQLite;
12+using TSOSorter;
13+//using TDCGExplorer;
14+
15+
16+namespace System.Windows.Forms
17+{
18+ public class TAHViewer : Control
19+ {
20+ List<ArcsTahFilesEntry> filesEntries;
21+ private TAHLocalDB database;
22+
23+ private ContextMenuStrip contextMenuStrip1;
24+ private System.ComponentModel.IContainer components;
25+ private DataGridView dataGridView1;
26+
27+ private string m_strTahDBPath; // 作業用DB
28+ private GenericTahInfo info; // TAH情報
29+
30+ /** コンストラクタ
31+ * */
32+ public TAHViewer()
33+ {
34+ m_strTahDBPath = Path.Combine(
35+ TSOSorter.TDCGExplorer.SystemDB.m_strTahWorkPath, Path.GetRandomFileName() + ".db");
36+ InitializeComponent();
37+ DataTable data = setupTable();
38+ dataGridView1.DataSource = data;
39+ Controls.Add(dataGridView1);
40+ }
41+ public void clearTable()
42+ {
43+ dataGridView1.DataSource = setupTable();// dataGridView1.Rows.Clear();
44+ }
45+ private DataTable setupTable()
46+ {
47+ DataTable data = new DataTable();
48+ data.Columns.Add("ID", Type.GetType("System.String"));
49+ data.Columns.Add(TSOSorter.TextResource.Filename, Type.GetType("System.String"));
50+ data.Columns.Add(TSOSorter.TextResource.FileType, Type.GetType("System.String"));
51+ data.Columns.Add(TSOSorter.TextResource.HashCode, Type.GetType("System.String"));
52+ data.Columns.Add(TSOSorter.TextResource.FileSize, Type.GetType("System.String"));
53+ data.Columns.Add(TSOSorter.TextResource.Category, Type.GetType("System.String"));
54+ return data;
55+ }
56+
57+ private void InitializeComponent()
58+ {
59+ this.components = new System.ComponentModel.Container();
60+ this.dataGridView1 = new System.Windows.Forms.DataGridView();
61+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
62+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
63+ this.SuspendLayout();
64+ //
65+ // dataGridView1
66+ //
67+ this.dataGridView1.AllowUserToAddRows = false;
68+ this.dataGridView1.AllowUserToDeleteRows = false;
69+ this.dataGridView1.AllowUserToResizeRows = false;
70+ this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
71+ this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
72+ this.dataGridView1.Location = new System.Drawing.Point(0, 0);
73+ this.dataGridView1.Name = "dataGridView1";
74+ this.dataGridView1.ReadOnly = true;
75+ this.dataGridView1.RowTemplate.Height = 21;
76+ this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
77+ this.dataGridView1.Size = new System.Drawing.Size(240, 150);
78+ this.dataGridView1.TabIndex = 0;
79+ this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellClick);
80+ //
81+ // contextMenuStrip1
82+ //
83+ this.contextMenuStrip1.Name = "contextMenuStrip1";
84+ this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4);
85+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
86+ this.ResumeLayout(false);
87+
88+ }
89+
90+ public void Setup(GenericTahInfo entryInfo, List<ArcsTahFilesEntry> filesentries)
91+ {
92+ info = entryInfo;
93+ filesEntries = filesentries;
94+
95+ DataTable data = setupTable();
96+ // 追加
97+ foreach (ArcsTahFilesEntry file in filesentries)
98+ {
99+ DataRow row = data.NewRow();
100+ string[] content = { file.tahentry.ToString(), file.GetDisplayPath(), Path.GetExtension(file.path), file.hash.ToString("x8"), file.length.ToString(), TDCGTbnUtil.GetCategoryText(file.GetDisplayPath()) };
101+ row.ItemArray = content;
102+ data.Rows.Add(row);
103+ }
104+ dataGridView1.DataSource = data;
105+
106+ LoadPsdFile(0);
107+ TSOSorter.TDCGExplorer.SetToolTips(info.shortname + " : " + TextResource.TSOMessage);
108+ }
109+ private void LoadPsdFile(int index)
110+ {
111+ try
112+ {
113+ string ext = Path.GetExtension(filesEntries[index].path).ToLower();
114+ string psdfilename = filesEntries[index].path;
115+ string psdpath = "data/icon/items/";
116+ if (Path.GetDirectoryName(filesEntries[index].path).ToLower() == "script\\backgrounds")
117+ psdpath = "data/icon/backgrounds/";
118+ if (ext != ".psd")
119+ {
120+ string fname = Path.GetFileNameWithoutExtension(psdfilename);
121+ psdfilename = psdpath + fname + ".psd";
122+ }
123+ psdfilename = psdfilename.ToLower();
124+ foreach (ArcsTahFilesEntry fentry in filesEntries)
125+ {
126+ if (fentry.path.ToLower() == psdfilename)
127+ {
128+ using (GenericTAHStream tahstream = new GenericTAHStream(info, fentry))
129+ {
130+ PSDFile psd = new PSDFile();
131+ psd.Load(tahstream.stream);
132+#if false
133+ TDCGExplorer.TDCGExplorer.MainFormWindow.PictureBox.Image = psd.Bitmap;
134+ TDCGExplorer.TDCGExplorer.MainFormWindow.PictureBox.Width = psd.Bitmap.Width;
135+ TDCGExplorer.TDCGExplorer.MainFormWindow.PictureBox.Height = psd.Bitmap.Height;
136+#else
137+ Program.MainFormWindow.SetBitmap(psd.Bitmap);
138+#endif
139+ }
140+ return;
141+ }
142+ }
143+ }
144+ catch (Exception)
145+ {
146+ }
147+ NoImageIcon();
148+ }
149+ private void NoImageIcon()
150+ {
151+ //Bitmap noimage = new Bitmap("noimage.jpg");
152+ Bitmap noimage = new Bitmap(1, 1);
153+ Program.MainFormWindow.SetBitmap(noimage);
154+ }
155+
156+ private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
157+ {
158+ try
159+ {
160+ if (e.RowIndex < 0)
161+ {
162+ return;
163+ }
164+
165+ System.Windows.Forms.DataGridViewRow dgr = this.dataGridView1.CurrentRow;
166+ System.Data.DataRowView drv = (System.Data.DataRowView)dgr.DataBoundItem;
167+ System.Data.DataRow dr = (System.Data.DataRow)drv.Row;
168+ int index = int.Parse(dr.ItemArray[0].ToString());
169+
170+ if (index >= 0)
171+ {
172+ LoadPsdFile(index);
173+ }
174+
175+ }
176+ catch (Exception ex)
177+ {
178+ Debug.WriteLine(ex.Message);
179+ }
180+ }
181+
182+
183+ }
184+}
--- TSOSorter/Source/GenericDatabase.cs (nonexistent)
+++ TSOSorter/Source/GenericDatabase.cs (revision 3)
@@ -0,0 +1,34 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Data.SQLite;
7+using System.Diagnostics;
8+
9+
10+namespace TSOSorter
11+{
12+ /** DBコンテナ
13+ * */
14+ public class GenericDatabase : IDisposable
15+ {
16+ public void Dispose()
17+ {
18+ if (cnn != null)
19+ {
20+ cnn.Close();
21+ cnn.Dispose();
22+ cnn = null;
23+ }
24+ }
25+ protected string filepath = null; // filepath
26+ protected SQLiteConnection cnn = null; // connection
27+ //トランザクションを開始する.
28+ public SQLiteTransaction BeginTransaction()
29+ {
30+ return cnn.BeginTransaction();
31+ }
32+
33+ }
34+}
--- TSOSorter/Source/FileViewer.cs (nonexistent)
+++ TSOSorter/Source/FileViewer.cs (revision 3)
@@ -0,0 +1,163 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Diagnostics;
7+using System.Data;
8+using TDCGExplorer;
9+using System.Data.SQLite;
10+using TSOSorter;
11+
12+namespace System.Windows.Forms
13+{
14+ public class FileViewer : Control
15+ {
16+ private ContextMenuStrip contextMenuStrip1;
17+ private DataGridView dataGridView1;
18+ private System.ComponentModel.IContainer components;
19+
20+ private string m_strFileDBPath; // 作業用DB
21+
22+ /** コンストラクタ
23+ * */
24+ public FileViewer()
25+ {
26+ // DBPath設定
27+ m_strFileDBPath = Path.Combine(
28+ TSOSorter.TDCGExplorer.SystemDB.m_strTahWorkPath, "files.db");
29+
30+ InitializeComponent();
31+ // dataGridViewを設定
32+ DataTable data = setupDataTable();
33+ dataGridView1.DataSource = data;
34+ Controls.Add(dataGridView1);
35+ }
36+
37+ public void clearTable()
38+ {
39+ //dataGridView1.Rows.Clear();
40+ dataGridView1.DataSource = setupDataTable();
41+ }
42+ /** dataGridViewのテーブル作成
43+ * */
44+ private DataTable setupDataTable()
45+ {
46+ DataTable data = new DataTable();
47+ // ROWID
48+ data.Columns.Add("ID", Type.GetType("System.String"));
49+ // TAH dir
50+ data.Columns.Add(TSOSorter.TextResource.Directory, Type.GetType("System.String"));
51+ // TAH File Name
52+ data.Columns.Add(TSOSorter.TextResource.Filename, Type.GetType("System.String"));
53+ data.Columns.Add(TSOSorter.TextResource.TSOHead, Type.GetType("System.String"));
54+ data.Columns.Add(TSOSorter.TextResource.Category , Type.GetType("System.String"));
55+ return data;
56+ }
57+ private void InitializeComponent()
58+ {
59+ this.components = new System.ComponentModel.Container();
60+ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
61+ this.dataGridView1 = new System.Windows.Forms.DataGridView();
62+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
63+ this.SuspendLayout();
64+ //
65+ // contextMenuStrip1
66+ //
67+ this.contextMenuStrip1.Name = "contextMenuStrip1";
68+ this.contextMenuStrip1.Size = new System.Drawing.Size(61, 4);
69+ //
70+ // dataGridView1
71+ //
72+ this.dataGridView1.AllowUserToAddRows = false;
73+ this.dataGridView1.AllowUserToDeleteRows = false;
74+ this.dataGridView1.AllowUserToResizeRows = false;
75+ this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
76+ this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
77+ this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
78+ this.dataGridView1.Location = new System.Drawing.Point(0, 0);
79+ this.dataGridView1.MultiSelect = false;
80+ this.dataGridView1.Name = "dataGridView1";
81+ this.dataGridView1.ReadOnly = true;
82+ this.dataGridView1.RowTemplate.Height = 21;
83+ this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
84+ this.dataGridView1.Size = new System.Drawing.Size(240, 150);
85+ this.dataGridView1.TabIndex = 0;
86+ this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellClick);
87+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
88+ this.ResumeLayout(false);
89+
90+ }
91+
92+ /** ファイルをDBから取得して追加
93+ * */
94+ public void AddFiles(TSOSorter.FileDatabase filedb, string strPartType)
95+ {
96+ // File Row ID取得(TSO名でソート
97+ List<int> lstFileRowIDs = filedb.GetFileRowIDs(
98+ TSOSorter.FileDatabase.SortType.TSO_NAME, strPartType);
99+ // data table
100+ DataTable data = setupDataTable();//dataGridView1.DataSource as DataTable;
101+ foreach (int nFileRowID in lstFileRowIDs)
102+ {
103+ object[] obj = getFileRow(nFileRowID, filedb, strPartType);
104+ if (obj == null)
105+ {
106+ continue;
107+ }
108+ DataRow row = data.NewRow();
109+ //
110+ row.ItemArray = obj;
111+ data.Rows.Add(row);
112+ }
113+ dataGridView1.DataSource = data;
114+ }
115+
116+ /** Fileリストの業を追加(追加用行データ)を取得
117+ * */
118+ public string[] getFileRow(int nFileRowID, FileDatabase filedb, string strPartType)
119+ {
120+ FileEntry fileEntry = filedb.getFileEntry( nFileRowID );
121+ TSONameEntry tsoNameEntry = filedb.getFirstTSONameEntry( nFileRowID, strPartType );
122+ if (tsoNameEntry == null)
123+ {
124+ return null;
125+ }
126+ string[] content = { nFileRowID.ToString(),Path.GetDirectoryName( fileEntry.m_strPath ), fileEntry.m_strShortName, tsoNameEntry.m_strMODName, strPartType };
127+ return content;
128+ }
129+
130+ /** dataGridViewのセルをクリック
131+ * */
132+ private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
133+ {
134+ try
135+ {
136+ if (e.RowIndex < 0)
137+ {
138+ return;
139+ }
140+
141+ System.Windows.Forms.DataGridViewRow dgr = dataGridView1.CurrentRow;
142+ System.Data.DataRowView drv = (System.Data.DataRowView)dgr.DataBoundItem;
143+ System.Data.DataRow dr = (System.Data.DataRow)drv.Row;
144+ int nFileRowID = int.Parse(dr.ItemArray[0].ToString());
145+
146+ if (nFileRowID >= 0)
147+ {
148+ FileEntry fileEntry = TSOSorter.TDCGExplorer.FileDB.getFileEntry(nFileRowID);
149+ ArcsTahEntry entry = TSOSorter.TDCGExplorer.ArcsDB.GetTah(fileEntry.m_strPath);
150+ GenericArcsTahInfo info = new GenericArcsTahInfo(entry);
151+ Program.MainFormWindow.TAHViewer.Setup(info,
152+ TSOSorter.TDCGExplorer.ArcsDB.GetTahFilesPath(entry.id));
153+ }
154+ }
155+ catch (Exception ex)
156+ {
157+ Debug.WriteLine(ex.Message);
158+ }
159+ }
160+
161+
162+ }
163+}
--- TSOSorter/Source/AboutBox1.Designer.cs (nonexistent)
+++ TSOSorter/Source/AboutBox1.Designer.cs (revision 3)
@@ -0,0 +1,186 @@
1+namespace TSOSorter
2+{
3+ partial class AboutBox1
4+ {
5+ /// <summary>
6+ /// 必要なデザイナ変数です。
7+ /// </summary>
8+ private System.ComponentModel.IContainer components = null;
9+
10+ /// <summary>
11+ /// 使用中のリソースをすべてクリーンアップします。
12+ /// </summary>
13+ protected override void Dispose(bool disposing)
14+ {
15+ if (disposing && (components != null))
16+ {
17+ components.Dispose();
18+ }
19+ base.Dispose(disposing);
20+ }
21+
22+ #region Windows フォーム デザイナで生成されたコード
23+
24+ /// <summary>
25+ /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
26+ /// コード エディタで変更しないでください。
27+ /// </summary>
28+ private void InitializeComponent()
29+ {
30+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox1));
31+ this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
32+ this.logoPictureBox = new System.Windows.Forms.PictureBox();
33+ this.labelProductName = new System.Windows.Forms.Label();
34+ this.labelVersion = new System.Windows.Forms.Label();
35+ this.labelCopyright = new System.Windows.Forms.Label();
36+ this.labelCompanyName = new System.Windows.Forms.Label();
37+ this.textBoxDescription = new System.Windows.Forms.TextBox();
38+ this.okButton = new System.Windows.Forms.Button();
39+ this.tableLayoutPanel.SuspendLayout();
40+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
41+ this.SuspendLayout();
42+ //
43+ // tableLayoutPanel
44+ //
45+ this.tableLayoutPanel.ColumnCount = 2;
46+ this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
47+ this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
48+ this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
49+ this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
50+ this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
51+ this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
52+ this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
53+ this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
54+ this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
55+ this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
56+ this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8);
57+ this.tableLayoutPanel.Name = "tableLayoutPanel";
58+ this.tableLayoutPanel.RowCount = 6;
59+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
60+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
61+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
62+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
63+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
64+ this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
65+ this.tableLayoutPanel.Size = new System.Drawing.Size(417, 245);
66+ this.tableLayoutPanel.TabIndex = 0;
67+ //
68+ // logoPictureBox
69+ //
70+ this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
71+ this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
72+ this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
73+ this.logoPictureBox.Name = "logoPictureBox";
74+ this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
75+ this.logoPictureBox.Size = new System.Drawing.Size(131, 239);
76+ this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
77+ this.logoPictureBox.TabIndex = 12;
78+ this.logoPictureBox.TabStop = false;
79+ //
80+ // labelProductName
81+ //
82+ this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
83+ this.labelProductName.Location = new System.Drawing.Point(143, 0);
84+ this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
85+ this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16);
86+ this.labelProductName.Name = "labelProductName";
87+ this.labelProductName.Size = new System.Drawing.Size(271, 16);
88+ this.labelProductName.TabIndex = 19;
89+ this.labelProductName.Text = "製品名";
90+ this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
91+ //
92+ // labelVersion
93+ //
94+ this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
95+ this.labelVersion.Location = new System.Drawing.Point(143, 24);
96+ this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
97+ this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16);
98+ this.labelVersion.Name = "labelVersion";
99+ this.labelVersion.Size = new System.Drawing.Size(271, 16);
100+ this.labelVersion.TabIndex = 0;
101+ this.labelVersion.Text = "バージョン";
102+ this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
103+ //
104+ // labelCopyright
105+ //
106+ this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
107+ this.labelCopyright.Location = new System.Drawing.Point(143, 48);
108+ this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
109+ this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16);
110+ this.labelCopyright.Name = "labelCopyright";
111+ this.labelCopyright.Size = new System.Drawing.Size(271, 16);
112+ this.labelCopyright.TabIndex = 21;
113+ this.labelCopyright.Text = "著作権";
114+ this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
115+ //
116+ // labelCompanyName
117+ //
118+ this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
119+ this.labelCompanyName.Location = new System.Drawing.Point(143, 72);
120+ this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
121+ this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 16);
122+ this.labelCompanyName.Name = "labelCompanyName";
123+ this.labelCompanyName.Size = new System.Drawing.Size(271, 16);
124+ this.labelCompanyName.TabIndex = 22;
125+ this.labelCompanyName.Text = "-";
126+ this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
127+ //
128+ // textBoxDescription
129+ //
130+ this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
131+ this.textBoxDescription.Location = new System.Drawing.Point(143, 99);
132+ this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
133+ this.textBoxDescription.Multiline = true;
134+ this.textBoxDescription.Name = "textBoxDescription";
135+ this.textBoxDescription.ReadOnly = true;
136+ this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
137+ this.textBoxDescription.Size = new System.Drawing.Size(271, 116);
138+ this.textBoxDescription.TabIndex = 23;
139+ this.textBoxDescription.TabStop = false;
140+ this.textBoxDescription.Text = "arcsフォルダ配下をTSO名でソート表示するツールです。";
141+ //
142+ // okButton
143+ //
144+ this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
145+ this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
146+ this.okButton.Location = new System.Drawing.Point(339, 221);
147+ this.okButton.Name = "okButton";
148+ this.okButton.Size = new System.Drawing.Size(75, 21);
149+ this.okButton.TabIndex = 24;
150+ this.okButton.Text = "&OK";
151+ //
152+ // AboutBox1
153+ //
154+ this.AcceptButton = this.okButton;
155+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
156+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
157+ this.ClientSize = new System.Drawing.Size(435, 261);
158+ this.Controls.Add(this.tableLayoutPanel);
159+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
160+ this.MaximizeBox = false;
161+ this.MinimizeBox = false;
162+ this.Name = "AboutBox1";
163+ this.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8);
164+ this.ShowIcon = false;
165+ this.ShowInTaskbar = false;
166+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
167+ this.Text = "TSOSorterについて";
168+ this.tableLayoutPanel.ResumeLayout(false);
169+ this.tableLayoutPanel.PerformLayout();
170+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
171+ this.ResumeLayout(false);
172+
173+ }
174+
175+ #endregion
176+
177+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
178+ private System.Windows.Forms.PictureBox logoPictureBox;
179+ private System.Windows.Forms.Label labelProductName;
180+ private System.Windows.Forms.Label labelVersion;
181+ private System.Windows.Forms.Label labelCopyright;
182+ private System.Windows.Forms.Label labelCompanyName;
183+ private System.Windows.Forms.TextBox textBoxDescription;
184+ private System.Windows.Forms.Button okButton;
185+ }
186+}
--- TSOSorter/Source/FileDatabase.cs (nonexistent)
+++ TSOSorter/Source/FileDatabase.cs (revision 3)
@@ -0,0 +1,322 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Data.SQLite;
7+using System.Diagnostics;
8+
9+namespace TSOSorter
10+{
11+
12+ /** Fileエントリ
13+ * */
14+ public class FileEntry
15+ {
16+ public string m_strPath; // arcsからの相対パス+ファイル名+拡張子
17+ public string m_strShortName; // ファイル名+拡張子のみ
18+ }
19+ /** File -> TSOのリレーション( File : TSO = 1 : 多 )
20+ * */
21+ public class FileTSORel
22+ {
23+ public int m_nRowID;
24+ public int m_nFileRowID;
25+ public int m_nTSORowID;
26+ }
27+ /** 中に含まれるTSO名エントリ
28+ * */
29+ public class TSONameEntry
30+ {
31+ public string m_strTSOName; // NXXXXXXX_*99.tsoの拡張子以外
32+// public int m_nRowID;
33+ public string m_strTypeString; // type
34+ public string m_strMODName; // NXXXXXXX_*99の"NXXXXXXX"部分
35+ }
36+ public class FileDatabase : GenericDatabase
37+ {
38+ public FileEntry getFileEntry(int nFileRowID)
39+ {
40+ FileEntry entry = null;
41+ using (SQLiteCommand cmd = cnn.CreateCommand())
42+ {
43+ cmd.CommandText = "SELECT PATH,SHORTNAME FROM Files WHERE ROWID=@rowid";
44+ cmd.Parameters.AddWithValue("rowid", nFileRowID);
45+ using (SQLiteDataReader reader = cmd.ExecuteReader())
46+ {
47+ while (reader.Read())
48+ {
49+ entry = new FileEntry();
50+ entry.m_strPath = reader[0].ToString();
51+ entry.m_strShortName = reader[1].ToString();
52+ break;
53+ }
54+ }
55+ }
56+ return entry;
57+ }
58+
59+/* public FileEntry getFileEntry(string path, string shortname)
60+ {
61+ FileEntry entry = null;
62+ using (SQLiteCommand cmd = cnn.CreateCommand())
63+ {
64+ cmd.CommandText = "SELECT PATH,SHORTNAME FROM Files WHERE PATH=@path";
65+ cmd.Parameters.AddWithValue("path", path);
66+ using (SQLiteDataReader reader = cmd.ExecuteReader())
67+ {
68+ while (reader.Read())
69+ {
70+ entry = new FileEntry();
71+ entry.m_strPath = reader[0].ToString();
72+ entry.m_strShortName = reader[1].ToString();
73+ break;
74+ }
75+ }
76+ }
77+ return entry;
78+ }*/
79+ /** 一個目のTSO名を取得
80+ * */
81+ public TSONameEntry getFirstTSONameEntry(int nFileRowID, string strPartType)
82+ {
83+ TSONameEntry entry = null;
84+ using (SQLiteCommand cmd = cnn.CreateCommand())
85+ {
86+ cmd.CommandText = "SELECT DISTINCT Tsos.TSONAME,Tsos.MODNAME FROM Files,Rels,Tsos WHERE Files.ROWID=Rels.FILEROWID AND Rels.TSOROWID=Tsos.ROWID AND Files.ROWID=@filerowid AND Tsos.Type=@type";
87+ cmd.Parameters.AddWithValue( "filerowid", nFileRowID );
88+ cmd.Parameters.AddWithValue( "type", strPartType);
89+ using (SQLiteDataReader reader = cmd.ExecuteReader())
90+ {
91+ while (reader.Read())
92+ {
93+ entry = new TSONameEntry();
94+ entry.m_strTSOName = reader[0].ToString();
95+ entry.m_strMODName = reader[1].ToString();
96+ entry.m_strTypeString = strPartType;
97+ break;
98+ }
99+ }
100+ }
101+ return entry;
102+ }
103+ public enum SortType
104+ {
105+ FILE_PATH,
106+ TSO_NAME,
107+ }
108+// string m_strFilePath = null;
109+// private SQLiteConnection cnn = null;
110+
111+ public FileDatabase() {
112+ Directory.CreateDirectory(GetFileDatabasePath());
113+ cnn = new SQLiteConnection("Data Source=" + GetFileDatabaseName());
114+ cnn.Open();
115+ }
116+ public string GetFileDatabasePath()
117+ {
118+ return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), TDCGExplorer.GetAppDataPath());
119+ }
120+
121+ public string GetFileDatabaseName()
122+ {
123+ return Path.Combine(GetFileDatabasePath(), "files.db");
124+ }
125+ public void deleteAll()
126+ {
127+ try
128+ {
129+ using (SQLiteCommand cmd = cnn.CreateCommand())
130+ {
131+ cmd.CommandText = "DELETE FROM Files";
132+ cmd.ExecuteNonQuery();
133+ cmd.CommandText = "DELETE FROM Tsos";
134+ cmd.ExecuteNonQuery();
135+ cmd.CommandText = "DELETE FROM Rels";
136+ cmd.ExecuteNonQuery();
137+ }
138+ }
139+ catch (Exception e)
140+ {
141+ Debug.WriteLine(e.Message);
142+ }
143+ }
144+
145+ /** DB作成
146+ * */
147+ public void createTables()
148+ {
149+ // ファイルテーブル
150+ try
151+ {
152+ using (SQLiteCommand cmd = cnn.CreateCommand())
153+ {
154+ cmd.CommandText = "CREATE TABLE Files (PATH TEXT PRIMARY KEY, SHORTNAME TEXT)";
155+ cmd.ExecuteNonQuery();
156+ }
157+ }
158+ catch (Exception e)
159+ {
160+ Debug.WriteLine(e.Message);
161+ }
162+
163+ // TSO名テーブル
164+ try
165+ {
166+ using (SQLiteCommand cmd = cnn.CreateCommand())
167+ {
168+ cmd.CommandText = "CREATE TABLE Tsos (TSONAME TEXT, TYPE TEXT, MODNAME TEXT)";
169+ cmd.ExecuteNonQuery();
170+ }
171+ }
172+ catch (Exception e)
173+ {
174+ Debug.WriteLine(e.Message);
175+ }
176+
177+ // ファイル⇔TSOリレーションテーブル
178+ try
179+ {
180+ using (SQLiteCommand cmd = cnn.CreateCommand())
181+ {
182+ cmd.CommandText = "CREATE TABLE Rels (FILEROWID INTEGER, TSOROWID INTEGER)";
183+ cmd.ExecuteNonQuery();
184+ }
185+ }
186+ catch (Exception e)
187+ {
188+ Debug.WriteLine(e.Message);
189+ }
190+ }
191+ /** ファイルエントリ追加
192+ * @retval RowID
193+ * */
194+ public int AddFile(FileEntry entry)
195+ {
196+ int nFileRowID = -1;
197+ try
198+ {
199+ using (SQLiteCommand cmd = cnn.CreateCommand())
200+ {
201+ cmd.CommandText = "INSERT INTO Files (PATH,SHORTNAME) VALUES(@path,@shortname)";
202+ cmd.Parameters.AddWithValue("path", entry.m_strPath);
203+ cmd.Parameters.AddWithValue("shortname", entry.m_strShortName);
204+ cmd.ExecuteNonQuery();
205+
206+ // 挿入したエントリのRowIDを取得
207+ cmd.CommandText = "SELECT last_insert_rowid()";
208+ using (SQLiteDataReader reader = cmd.ExecuteReader())
209+ {
210+ while (reader.Read())
211+ {
212+ nFileRowID = Int16.Parse(reader[0].ToString());
213+ break;
214+ }
215+ }
216+ }
217+ }
218+ catch (Exception e)
219+ {
220+ Debug.WriteLine(e.Message);
221+ }
222+ return nFileRowID;
223+ }
224+ int getFileRowID(string strFilePath)
225+ {
226+ int nFileRowID = -1;
227+ using (SQLiteCommand cmd = cnn.CreateCommand())
228+ {
229+ cmd.CommandText = "SELECT ROWID FROM Files WHERE UPPER(PATH)=UPPER(@path)";
230+ cmd.Parameters.AddWithValue("path", strFilePath);
231+ using (SQLiteDataReader reader = cmd.ExecuteReader())
232+ {
233+ while (reader.Read())
234+ {
235+ nFileRowID = Int16.Parse(reader[0].ToString());
236+ break;
237+ }
238+ }
239+ }
240+ return nFileRowID;
241+ }
242+ /**
243+ * @retval 0以上 挿入したエントリのRowID
244+ * -1 何らかの理由により追加できなかった
245+ * */
246+ public int AddTSOName(int nFileRowID, TSONameEntry entry)
247+ {
248+ int nTsoRowID = -1;
249+ using (SQLiteCommand cmd = cnn.CreateCommand())
250+ {
251+ cmd.CommandText = "INSERT INTO Tsos (TSONAME,MODNAME,TYPE) VALUES(@tsoname,@modname,@type)";
252+ cmd.Parameters.AddWithValue("tsoname", entry.m_strTSOName);
253+ cmd.Parameters.AddWithValue("modname", entry.m_strMODName);
254+ cmd.Parameters.AddWithValue("type", entry.m_strTypeString);
255+ cmd.ExecuteNonQuery();
256+
257+ // 挿入したエントリのRowIDを取得
258+ cmd.CommandText = "SELECT last_insert_rowid()";
259+ using (SQLiteDataReader reader = cmd.ExecuteReader())
260+ {
261+ while (reader.Read())
262+ {
263+ nTsoRowID = Int16.Parse(reader[0].ToString());
264+ break;
265+ }
266+ }
267+ // セット
268+// entry.m_nRowID = nTsoRowID;
269+
270+
271+
272+// cmd.Parameters.AddWithValue("hash", entry.m_nHash);
273+ }
274+ if (nTsoRowID < 0)
275+ {
276+ return nTsoRowID;
277+ }
278+ // 関係性を追加
279+ using (SQLiteCommand cmd = cnn.CreateCommand())
280+ {
281+
282+ cmd.CommandText = "INSERT INTO Rels (FILEROWID,TSOROWID) VALUES(@filerowid,@tsorowid)";
283+ cmd.Parameters.AddWithValue("filerowid", nFileRowID);
284+ cmd.Parameters.AddWithValue("tsorowid", nTsoRowID);
285+ cmd.ExecuteNonQuery();
286+
287+ }
288+ return nTsoRowID;
289+ }
290+ /** ファイルハッシュ一覧を取得
291+ * */
292+ public List<int> GetFileRowIDs( SortType sortType, string strPartsType)
293+ {
294+ List<int> lst = new List<int>();
295+ using (SQLiteCommand cmd = cnn.CreateCommand())
296+ {
297+ cmd.CommandText = "SELECT ROWID FROM Files ORDER BY PATH";
298+ switch (sortType)
299+ {
300+ case SortType.TSO_NAME:
301+ if (strPartsType == "")
302+ {
303+ break;
304+ }
305+ else
306+ {
307+ cmd.CommandText = "SELECT DISTINCT Files.ROWID FROM Files,Rels,Tsos WHERE Files.ROWID=Rels.FILEROWID AND Rels.TSOROWID=Tsos.ROWID ORDER BY Tsos.MODNAME";
308+ }
309+ break;
310+ }
311+ using (SQLiteDataReader reader = cmd.ExecuteReader()) {
312+ while (reader.Read())
313+ {
314+ lst.Add(int.Parse(reader[0].ToString()));
315+ }
316+ }
317+ }
318+ return lst;
319+ }
320+ }
321+
322+}
--- TSOSorter/Source/AboutBox1.cs (nonexistent)
+++ TSOSorter/Source/AboutBox1.cs (revision 3)
@@ -0,0 +1,104 @@
1+using System;
2+using System.Collections.Generic;
3+using System.ComponentModel;
4+using System.Drawing;
5+using System.Linq;
6+using System.Reflection;
7+using System.Windows.Forms;
8+
9+namespace TSOSorter
10+{
11+ partial class AboutBox1 : Form
12+ {
13+ public AboutBox1()
14+ {
15+ InitializeComponent();
16+ this.Text = String.Format("{0} のバージョン情報 {0}", AssemblyTitle);
17+ this.labelProductName.Text = AssemblyProduct;
18+ this.labelVersion.Text = String.Format("バージョン {0} {0}", AssemblyVersion);
19+ this.labelCopyright.Text = AssemblyCopyright;
20+ this.labelCompanyName.Text = AssemblyCompany;
21+ this.textBoxDescription.Text = AssemblyDescription;
22+ }
23+
24+ #region アセンブリ属性アクセサ
25+
26+ public string AssemblyTitle
27+ {
28+ get
29+ {
30+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
31+ if (attributes.Length > 0)
32+ {
33+ AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
34+ if (titleAttribute.Title != "")
35+ {
36+ return titleAttribute.Title;
37+ }
38+ }
39+ return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
40+ }
41+ }
42+
43+ public string AssemblyVersion
44+ {
45+ get
46+ {
47+ return Assembly.GetExecutingAssembly().GetName().Version.ToString();
48+ }
49+ }
50+
51+ public string AssemblyDescription
52+ {
53+ get
54+ {
55+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
56+ if (attributes.Length == 0)
57+ {
58+ return "";
59+ }
60+ return ((AssemblyDescriptionAttribute)attributes[0]).Description;
61+ }
62+ }
63+
64+ public string AssemblyProduct
65+ {
66+ get
67+ {
68+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
69+ if (attributes.Length == 0)
70+ {
71+ return "";
72+ }
73+ return ((AssemblyProductAttribute)attributes[0]).Product;
74+ }
75+ }
76+
77+ public string AssemblyCopyright
78+ {
79+ get
80+ {
81+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
82+ if (attributes.Length == 0)
83+ {
84+ return "";
85+ }
86+ return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
87+ }
88+ }
89+
90+ public string AssemblyCompany
91+ {
92+ get
93+ {
94+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
95+ if (attributes.Length == 0)
96+ {
97+ return "";
98+ }
99+ return ((AssemblyCompanyAttribute)attributes[0]).Company;
100+ }
101+ }
102+ #endregion
103+ }
104+}
--- TSOSorter/Source/TSOSorter.cs (nonexistent)
+++ TSOSorter/Source/TSOSorter.cs (revision 3)
@@ -0,0 +1,11 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+
6+namespace TSOSorter
7+{
8+ class TSOSorter
9+ {
10+ }
11+}
--- TSOSorter/Source/FileDump.cs (nonexistent)
+++ TSOSorter/Source/FileDump.cs (revision 3)
@@ -0,0 +1,122 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Security.Cryptography;
7+using System.Text.RegularExpressions;
8+using System.Diagnostics;
9+using System.Data.SQLite;
10+using TDCGExplorer;
11+
12+namespace TSOSorter
13+{
14+ /** ファイルパスと該当ファイルのDB登録
15+ * 同時に内部のTSOファイル情報も登録
16+ * */
17+ public static class FileDump
18+ {
19+ public static string m_strTAHFilePath; // arcsからの相対パス
20+
21+ /** ファイルをDBへ登録する処理
22+ * @param[in] filepath arcsからの相対パス
23+ *
24+ * */
25+ public static void FileDumpMain(string filepath, FileDatabase db)
26+ {
27+ m_strTAHFilePath = filepath;
28+ TDCGExplorer.LastAccessFile = filepath;
29+ // arc path
30+ string strArcPath = TDCGExplorer.SystemDB.m_strArcPath;
31+ // full path(C:\...\*.tah)
32+ string strFullPath = Path.Combine(strArcPath, filepath);
33+ using (FileStream source = File.OpenRead(strFullPath))
34+ {
35+ // 指定TAHファイルを登録
36+ DumpTAHFile(source, db, filepath);
37+ }
38+ }
39+
40+ /** 各ファイルの読み込みと登録
41+ * @param[in] filepath arcsからの相対パス
42+ * */
43+ private static void DumpTAHFile(FileStream source, FileDatabase db, string filepath)
44+ {
45+ try
46+ {
47+ TDCGExplorer.SetToolTips("Processing " + Path.GetFileName(filepath));
48+ using (TAHFile tah = new TAHFile(source))
49+ {
50+ try
51+ {
52+ tah.LoadEntries();
53+ }
54+ catch (Exception ex)
55+ {
56+ Debug.WriteLine("Error: " + ex);
57+ return;
58+ }
59+
60+ // File情報登録
61+ FileEntry fileentry = new FileEntry();
62+ // arcsからの相対パス(ファイルパス、拡張子含む)(hoge\\test\\*.tah)
63+ fileentry.m_strPath = filepath;
64+ // ファイル名+拡張子(*.tah)
65+ fileentry.m_strShortName = Path.GetFileName(filepath);
66+
67+ // add file entry and get rowid
68+ int nFileRowID = db.AddFile(fileentry);
69+ if (nFileRowID < 0)
70+ {
71+ return;
72+ }
73+
74+ // TSOファイル情報とRel情報登録
75+ DumpTSOFiles(db, fileentry, tah, nFileRowID);
76+ }
77+ }
78+ catch (Exception e)
79+ {
80+ Debug.WriteLine(e.Message);
81+ }
82+ }
83+
84+ /** TAH内部ファイルのうち、data/model/*.TSOファイルのみを抽出
85+ * DBに登録していく
86+ * */
87+ private static void DumpTSOFiles(FileDatabase db, FileEntry fileentry, TAHFile tah, int nFileRowID)
88+ {
89+ string source = Path.Combine(TDCGExplorer.SystemDB.m_strArcPath, fileentry.m_strPath);
90+ foreach (TAHEntry ent in tah.EntrySet.Entries)
91+ {
92+ // if filename is null
93+ if (ent.FileName == null)
94+ {
95+// TDCGExplorer.SetToolTips("Dump " + ent.Hash.ToString("x8") + " file");
96+ continue;
97+ }
98+ else
99+ {
100+ TDCGExplorer.SetToolTips("Dump " + ent.FileName + " file");
101+ }
102+ // if .TSOファイル以外
103+ if( Path.GetExtension( ent.FileName ).ToLower() != ".tso") {
104+ // skip
105+ continue;
106+ }
107+ // if data/model配下以外(背景など
108+ if( ! ent.FileName.StartsWith("data/model" ) ) {
109+ continue;
110+ }
111+ TSONameEntry tsoentry = new TSONameEntry();
112+ // 「NXXXXXXX_A99」
113+ tsoentry.m_strTSOName = Path.GetFileNameWithoutExtension(ent.FileName );
114+ // 「NXXXXXXX_」
115+ tsoentry.m_strMODName = Path.GetFileName(ent.FileName).Substring(0,9 );
116+ // 「A」
117+ tsoentry.m_strTypeString = Path.GetFileName(ent.FileName).Substring(9, 1);
118+ db.AddTSOName(nFileRowID, tsoentry);
119+ }
120+ }
121+ }
122+}
--- TSOSorter/Source/TreeNode.cs (nonexistent)
+++ TSOSorter/Source/TreeNode.cs (revision 3)
@@ -0,0 +1,60 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Linq;
4+using System.Text;
5+using System.IO;
6+using System.Windows.Forms;
7+using System.Drawing;
8+using System.Diagnostics;
9+using TSOSorter;
10+
11+namespace TDCGExplorer
12+{
13+ public class GenericTahTreeNode : System.Windows.Forms.TreeNode
14+ {
15+ public GenericTahTreeNode(string text)
16+ : base(text)
17+ {
18+ }
19+ public virtual void DoTvTreeSelect()
20+ {
21+ }
22+ public virtual void DoEditAnnotation()
23+ {
24+ }
25+ public virtual void DoExploreNode()
26+ {
27+ TSOSorter.TDCGExplorer.ExplorerPath(FullPath);
28+ }
29+ }
30+
31+ // ファイル個別情報のファイルツリーノード.
32+ public class GenericFilesTreeNode : GenericTahTreeNode
33+ {
34+ private List<ArcsTahEntry> entries = new List<ArcsTahEntry>();
35+
36+ public GenericFilesTreeNode(string text)
37+ : base(text)
38+ {
39+ }
40+
41+ public List<ArcsTahEntry> Entries
42+ {
43+ get { return entries; }
44+ set { entries = value; }
45+ }
46+
47+ /** TAHファイルクリック