TransDB.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. //
  19. // ParseStr.h
  20. //
  21. //
  22. #ifndef __TRANSDB_H
  23. #define __TRANSDB_H
  24. #include "olestring.h"
  25. #include "list.h"
  26. #include "bin.h"
  27. class CNoxstringDlg;
  28. typedef struct
  29. {
  30. int numdialog;
  31. int missing;
  32. int unresolved;
  33. int resolved;
  34. int errors;
  35. } DLGREPORT;
  36. typedef struct
  37. {
  38. int numlabels;
  39. int numstrings;
  40. int missing;
  41. int retranslate;
  42. int too_big;
  43. int errors;
  44. int bad_format;
  45. int translated;
  46. } TRNREPORT;
  47. typedef enum
  48. {
  49. PMASK_NONE = 0,
  50. PMASK_MISSING = 0x00000001,
  51. PMASK_UNRESOLVED = 0x00000002,
  52. PMASK_BADFORMAT = 0x00000004,
  53. PMASK_TOOLONG = 0x00000008,
  54. PMASK_RETRANSLATE = 0x00000010,
  55. PMASK_ALL = 0xffffffff
  56. } PMASK;
  57. typedef enum
  58. {
  59. LANGID_US,
  60. LANGID_UK,
  61. LANGID_GERMAN,
  62. LANGID_FRENCH,
  63. LANGID_SPANISH,
  64. LANGID_ITALIAN,
  65. LANGID_JAPANESE,
  66. LANGID_JABBER,
  67. LANGID_KOREAN,
  68. LANGID_CHINESE,
  69. LANGID_UNKNOWN
  70. } LangID;
  71. typedef struct
  72. {
  73. LangID langid;
  74. char *name;
  75. char *initials ; // two character identifier
  76. char *character; // single character identifier
  77. } LANGINFO;
  78. LANGINFO* GetLangInfo ( LangID langid );
  79. char* GetLangName ( LangID langid );
  80. LANGINFO* GetLangInfo ( int index );
  81. LANGINFO* GetLangInfo ( char *language );
  82. class CWaveInfo
  83. {
  84. int wave_valid;
  85. DWORD wave_size_hi;
  86. DWORD wave_size_lo;
  87. int missing;
  88. public:
  89. CWaveInfo ( void );
  90. int Valid ( void ) { return wave_valid; };
  91. DWORD Lo ( void ) { return wave_size_lo; };
  92. DWORD Hi ( void ) { return wave_size_hi; };
  93. void SetValid( int new_valid ) { wave_valid = new_valid; };
  94. void SetLo ( DWORD new_lo ) { wave_size_lo = new_lo; };
  95. void SetHi ( DWORD new_hi ) { wave_size_hi = new_hi; };
  96. int Missing ( void ) { return missing; };
  97. void SetMissing ( int val ) { missing = val; };
  98. };
  99. class DBAttribs
  100. {
  101. DBAttribs *parent;
  102. int changed;
  103. int processed;
  104. void *match;
  105. public:
  106. DBAttribs( void ) { parent = NULL; changed = FALSE; processed = FALSE; match = NULL; };
  107. void SetParent ( DBAttribs *new_parent ) { parent = new_parent; };
  108. int IsChanged ( void ) { return changed; };
  109. void Changed ( void ) { changed = TRUE; if ( parent ) parent->Changed(); };
  110. void NotChanged ( void ) { changed = FALSE; };
  111. char ChangedSymbol ( void ) { return changed ? '*' :' '; };
  112. int IsProcessed ( void ) { return processed; };
  113. void Processed ( void ) { processed = TRUE; };
  114. void NotProcessed ( void ) { processed = FALSE; };
  115. void* Matched ( void ) { return match; };
  116. void Match ( void* new_match ) { match = new_match; };
  117. void NotMatched ( void ) { match = NULL; };
  118. };
  119. class TransDB;
  120. class NoxLabel;
  121. class NoxText;
  122. class Translation : public DBAttribs
  123. {
  124. TransDB *db;
  125. OLEString *text;
  126. OLEString *comment;
  127. LangID langid;
  128. int revision;
  129. int sent;
  130. public:
  131. CWaveInfo WaveInfo;
  132. Translation ( void );
  133. ~Translation ( );
  134. void SetDB ( TransDB *new_db );
  135. Translation* Clone ( void );
  136. void SetLangID ( LangID new_id ) { langid = new_id; };
  137. TransDB* DB ( void ) { return db; };
  138. void ClearChanges (void) { NotChanged(); };
  139. void ClearProcessed (void) { NotProcessed(); };
  140. void ClearMatched (void) { NotMatched(); };
  141. int Clear ( void ) { return 0;};
  142. void Set ( OLECHAR *string ) { text->Set ( string ); Changed();};
  143. void Set ( char *string ) { text->Set ( string ); Changed(); };
  144. OLECHAR* Get ( void ) { return text->Get (); };
  145. int Len ( void ) { return text->Len (); };
  146. char* GetSB ( void ) { return text->GetSB (); };
  147. void SetComment ( OLECHAR *string ) { comment->Set ( string ); Changed(); };
  148. void SetComment ( char *string ) { comment->Set ( string ); Changed(); };
  149. OLECHAR* Comment ( void ) { return comment->Get(); };
  150. char* CommentSB ( void ) { return comment->GetSB(); };
  151. int Revision ( void ) { return revision; };
  152. void SetRevision ( int new_rev ) { revision = new_rev; Changed(); };
  153. LangID GetLangID ( void ) { return langid; };
  154. char* Language ( void ) { return GetLangName ( langid );};
  155. void AddToTree ( CTreeCtrl *tc, HTREEITEM parent, int changes = FALSE );
  156. int TooLong ( int maxlen );
  157. int ValidateFormat ( NoxText *text );
  158. int IsSent ( void );
  159. void Sent ( int val );
  160. };
  161. class NoxText : public DBAttribs
  162. {
  163. TransDB *db;
  164. OLEString *text;
  165. NoxLabel *label;
  166. OLEString *wavefile;
  167. unsigned int line_number;
  168. List translations;
  169. int revision;
  170. int id;
  171. int retranslate;
  172. int sent;
  173. void init ( void );
  174. public:
  175. CWaveInfo WaveInfo;
  176. NoxText( void );
  177. ~NoxText( );
  178. void AddTranslation ( Translation *trans );
  179. Translation* FirstTranslation ( ListSearch &sh );
  180. Translation* NextTranslation ( ListSearch &sh );
  181. Translation* GetTranslation ( LangID langid );
  182. void SetDB ( TransDB *new_db );
  183. void ClearChanges ( void );
  184. void ClearProcessed ( void );
  185. void ClearMatched ( void );
  186. int Clear ( void );
  187. NoxText* Clone ( void );
  188. void Remove ( void );
  189. void AssignID ( void );
  190. void Set ( OLECHAR *string );
  191. void Set ( char *string );
  192. void SetID ( int new_id ) { id = new_id; Changed(); };
  193. int ID ( void ) { return id; };
  194. void LockText ( void ) { text->Lock(); };
  195. TransDB* DB ( void ) { return db; };
  196. OLECHAR* Get ( void ) { return text->Get (); } ;
  197. int Len ( void ) { return text->Len (); };
  198. char* GetSB ( void ) { return text->GetSB (); } ;
  199. void SetWave ( OLECHAR *string ) { wavefile->Set ( string ); Changed(); InvalidateAllWaves (); };
  200. void SetWave ( char *string ) { wavefile->Set ( string ); Changed(); InvalidateAllWaves (); };
  201. void SetLabel ( NoxLabel *new_label ) { label = new_label; };
  202. void SetRetranslate ( int flag = TRUE ) { retranslate = flag;};
  203. int Retranslate ( void ) { return retranslate; };
  204. OLECHAR* Wave ( void ) { return wavefile->Get (); } ;
  205. char* WaveSB ( void ) { return wavefile->GetSB (); } ;
  206. NoxLabel* Label ( void ) { return label; } ;
  207. int Revision ( void ) { return revision; } ;
  208. void SetRevision ( int new_rev ) { revision = new_rev; Changed(); } ;
  209. void IncRevision ( void ) { revision++; Changed(); };
  210. void AddToTree ( CTreeCtrl *tc, HTREEITEM parent, int changes = FALSE );
  211. int LineNumber ( void ) { return line_number; };
  212. void SetLineNumber ( int line ) { line_number = line; Changed(); };
  213. void FormatMetaString ( void ) { text->FormatMetaString (); Changed();};
  214. int IsDialog ( void );
  215. int DialogIsPresent ( const char *path, LangID langid = LANGID_US );
  216. int DialogIsValid ( const char *path, LangID langid = LANGID_US, int check = TRUE );
  217. int ValidateDialog( const char *path, LangID langid = LANGID_US );
  218. void InvalidateAllWaves ( void );
  219. void InvalidateWave ( void );
  220. void InvalidateWave ( LangID langid );
  221. int IsSent ( void );
  222. void Sent ( int val );
  223. };
  224. class NoxLabel : public DBAttribs
  225. {
  226. TransDB *db;
  227. OLEString *name;
  228. OLEString *comment;
  229. OLEString *context;
  230. OLEString *speaker;
  231. OLEString *listener;
  232. unsigned int max_len;
  233. unsigned int line_number;
  234. List text;
  235. void init ( void );
  236. public:
  237. NoxLabel ( void );
  238. ~NoxLabel ( );
  239. int Clear ( void );
  240. void ClearChanges ( void );
  241. void ClearProcessed ( void );
  242. void ClearMatched ( void );
  243. int AllMatched ( void );
  244. void Remove ( void );
  245. void AddText ( NoxText *new_text );
  246. void RemoveText ( NoxText *new_text );
  247. NoxText* FirstText ( ListSearch& sh );
  248. NoxText* NextText ( ListSearch& sh);
  249. NoxText* FindText ( OLECHAR *find_text );
  250. void SetDB ( TransDB *new_db );
  251. NoxLabel* Clone ( void );
  252. int NumStrings ( void ) { return text.NumItems(); };
  253. void SetMaxLen ( int max ) { max_len = max; Changed(); };
  254. int MaxLen ( void ) { return max_len; };
  255. void SetLineNumber( int line ) { line_number = line; Changed(); };
  256. int LineNumber ( void ) { return line_number; };
  257. TransDB* DB ( void ) { return db;};
  258. void LockName ( void ) { name->Lock(); };
  259. void SetName ( OLECHAR *string ) { name->Set ( string ); Changed(); };
  260. void SetName ( char *string ) { name->Set ( string ); Changed(); };
  261. void SetComment ( OLECHAR *string ) { comment->Set ( string ); Changed(); };
  262. void SetComment ( char *string ) { comment->Set ( string ); Changed(); };
  263. void SetContext ( OLECHAR *string ) { context->Set ( string ); Changed(); };
  264. void SetContext ( char *string ) { context->Set ( string ); Changed(); };
  265. void SetSpeaker ( char *string ) { speaker->Set ( string ); Changed(); };
  266. void SetSpeaker ( OLECHAR *string ) { speaker->Set ( string ); Changed(); };
  267. void SetListener ( char *string ) { listener->Set ( string ); Changed(); };
  268. void SetListener ( OLECHAR *string ) { listener->Set ( string ); Changed(); };
  269. OLECHAR* Name ( void ) { return name->Get (); };
  270. OLECHAR* Comment ( void ) { return comment->Get(); };
  271. OLECHAR* Context ( void ) { return context->Get(); };
  272. OLECHAR* Speaker ( void ) { return speaker->Get(); };
  273. OLECHAR* Listener ( void ) { return listener->Get(); };
  274. char* NameSB ( void ) { return name->GetSB (); };
  275. char* CommentSB ( void ) { return comment->GetSB(); };
  276. char* ContextSB ( void ) { return context->GetSB(); };
  277. char* SpeakerSB ( void ) { return speaker->GetSB(); };
  278. char* ListenerSB ( void ) { return listener->GetSB(); };
  279. void AddToTree ( CTreeCtrl *tc, HTREEITEM parent, int changes = FALSE );
  280. };
  281. #define TRANSDB_OPTION_NONE 00000000
  282. #define TRANSDB_OPTION_DUP_TEXT 00000001 // strings can be dupilcated across labels
  283. #define TRANSDB_OPTION_MULTI_TEXT 00000002 // labels can have more than 1 string
  284. const int START_STRING_ID = 10000;
  285. class TransDB : public DBAttribs
  286. {
  287. ListNode node;
  288. List labels;
  289. List obsolete;
  290. Bin *label_bin;
  291. Bin *text_bin;
  292. BinID *text_id_bin;
  293. Bin *obsolete_bin;
  294. char name[100];
  295. int num_obsolete;
  296. int next_string_id;
  297. int valid;
  298. int checked_for_errors;
  299. int last_error_count;
  300. int flags;
  301. public:
  302. TransDB ( char *name = "no name" );
  303. ~TransDB ( );
  304. void InvalidateDialog( LangID langid );
  305. void VerifyDialog( LangID langid, void (*cb) ( void ) = NULL );
  306. int ReportDialog( DLGREPORT *report, LangID langid, void (*print) ( const char *)= NULL, PMASK pmask= PMASK_ALL );
  307. int ReportTranslations( TRNREPORT *report, LangID langid, void (*print) ( const char *) = NULL, PMASK pmask = PMASK_ALL );
  308. void ReportDuplicates ( CNoxstringDlg *dlg = NULL );
  309. void AddLabel ( NoxLabel *label );
  310. void AddText ( NoxText *text );
  311. void AddObsolete ( NoxText *text );
  312. void RemoveLabel ( NoxLabel *label );
  313. void RemoveText ( NoxText *text );
  314. void RemoveObsolete ( NoxText *text );
  315. int Errors ( CNoxstringDlg *dlg = NULL );
  316. int HasErrors ( void ) { return checked_for_errors ? last_error_count != 0 : FALSE; };
  317. int Warnings ( CNoxstringDlg *dlg = NULL );
  318. int NumLabelsChanged ( void );
  319. int NumLabels ( void );
  320. int NumObsolete ( void ) { return num_obsolete; };
  321. NoxLabel* FirstLabel ( ListSearch& sh );
  322. NoxLabel* NextLabel ( ListSearch& sh);
  323. NoxText* FirstObsolete ( ListSearch& sh );
  324. NoxText* NextObsolete ( ListSearch& sh);
  325. NoxLabel* FindLabel ( OLECHAR *name );
  326. NoxText* FindText ( OLECHAR *text );
  327. NoxText* FindSubText ( OLECHAR *text, int item = 0 );
  328. NoxText* FindText ( int id );
  329. NoxText* FindNextText ( void );
  330. NoxText* FindObsolete ( OLECHAR *text );
  331. NoxText* FindNextObsolete ( void );
  332. int Clear ( void );
  333. void ClearChanges ( void );
  334. void ClearProcessed ( void );
  335. void ClearMatched ( void );
  336. TransDB* Next ( void );
  337. void AddToTree ( CTreeCtrl *tc, HTREEITEM parent, int changes = FALSE, void (*cb) ( void ) = NULL );
  338. char* Name ( void ) { return name;};
  339. void EnableIDs ( void ) { next_string_id = START_STRING_ID; };
  340. int NewID ( void ) { if ( next_string_id != -1) return next_string_id++; else return -1; };
  341. int ID ( void ) { return next_string_id; };
  342. void SetID ( int new_id ) { next_string_id = new_id; };
  343. int IsValid ( void ) { return valid; };
  344. void InValid ( void ) { valid = FALSE; };
  345. int DuplicatesAllowed ( void ) { return flags & TRANSDB_OPTION_DUP_TEXT;};
  346. int MultiTextAllowed ( void ) { return flags & TRANSDB_OPTION_MULTI_TEXT;};
  347. void AllowDupiclates ( int yes = TRUE) { yes ? flags |= TRANSDB_OPTION_DUP_TEXT : flags &= ~(TRANSDB_OPTION_DUP_TEXT ); };
  348. void AllowMultiText ( int yes = TRUE) { yes ? flags |= TRANSDB_OPTION_MULTI_TEXT : flags &= ~(TRANSDB_OPTION_MULTI_TEXT ); };
  349. };
  350. class DupNode : public ListNode
  351. {
  352. NoxText *original;
  353. NoxText *duplicate;
  354. public:
  355. DupNode ( NoxText *dup, NoxText *orig ) { original = orig; duplicate = dup, SetPriority ( orig->LineNumber ());};
  356. NoxText *Duplicate ( void ) { return duplicate; };
  357. NoxText *Original ( void ) { return original; };
  358. };
  359. extern TransDB* FirstTransDB ( void );
  360. #endif // __TRANSDB_H