Clone
ixen <ixen@copyhandler.com>
committed
on 12 Aug 06
Added dependency on macro ENABLE_MUTEX_DEBUGGING.
LoggerImprovements + 5 more
src/libictranslate/ResourceManager.cpp (+1 -29)
140 140                         case _T('n'):
141 141                                 *pszOut++ = _T('\n');
142 142                                 break;
143 143                         default:
144 144                                 *pszOut++ = _T('\\');
145 145                         }
146 146                 }
147 147                 else
148 148                         *pszOut++ = *pszIn++;
149 149         }
150 150         *pszOut = _T('\0');
151 151 }
152 152
153 153 CLangData::CLangData() :
154 154         m_pszFilename(NULL),
155 155         m_pszLngName(NULL),
156 156         m_pszFontFace(NULL),
157 157         m_wPointSize(0),
158 158         m_pszHelpName(NULL),
159 159         m_pszAuthor(NULL),
160           m_pszVersion(NULL),
161 160         m_bRTL(false),
162 161         m_uiSectionID(0),
163 162         m_bUpdating(false)
164 163 {
165 164 }
166 165
167 166 CLangData::~CLangData()
168 167 {
169 168         delete [] m_pszFilename;
170 169         delete [] m_pszLngName;
171 170         delete [] m_pszFontFace;
172 171         delete [] m_pszHelpName;
173 172         delete [] m_pszAuthor;
174           delete [] m_pszVersion;
175 173 }
176 174
177 175 void CLangData::Clear()
178 176 {
179 177         delete [] m_pszFilename;
180 178         m_pszFilename = NULL;
181 179         delete [] m_pszLngName;
182 180         m_pszLngName = NULL;
183 181         delete [] m_pszFontFace;
184 182         m_pszFontFace = NULL;
185 183         delete [] m_pszHelpName;
186 184         m_pszHelpName = NULL;
187 185         delete [] m_pszAuthor;
188 186         m_pszAuthor = NULL;
189           delete [] m_pszVersion;
190           m_pszVersion = NULL;
191 187
192 188         m_mapTranslation.clear();
193 189 }
194 190
195 191 CLangData::CLangData(const CLangData& ld) :
196 192         m_pszFilename(NULL),
197 193         m_pszLngName(NULL),
198 194         m_pszFontFace(NULL),
199 195         m_pszHelpName(NULL),
200           m_pszAuthor(NULL),
201           m_pszVersion(NULL)
  196         m_pszAuthor(NULL)
202 197 {
203 198         SetFilename(ld.GetFilename(true));
204 199         SetLangName(ld.GetLangName());
205 200         SetFontFace(ld.GetFontFace());
206 201         SetPointSize(ld.GetPointSize());
207 202         SetDirection(ld.GetDirection());
208 203         SetHelpName(ld.GetHelpName());
209 204         SetAuthor(ld.GetAuthor());
210           SetVersion(ld.GetVersion());
211 205 }
212 206
213 207 CLangData& CLangData::operator=(const CLangData& rSrc)
214 208 {
215 209         if(this != &rSrc)
216 210         {
217 211                 SetFilename(rSrc.GetFilename(true));
218 212                 SetLangName(rSrc.GetLangName());
219 213                 SetFontFace(rSrc.GetFontFace());
220 214                 SetPointSize(rSrc.GetPointSize());
221 215                 SetDirection(rSrc.GetDirection());
222 216                 SetHelpName(rSrc.GetHelpName());
223 217                 SetAuthor(rSrc.GetAuthor());
224                   SetVersion(rSrc.GetVersion());
225 218         }
226 219
227 220         return *this;
228 221 }
229 222
230 223 bool CLangData::ReadInfo(PCTSTR pszFile)
231 224 {
232 225         try
233 226         {
234 227                 icpf::config cfg(icpf::config::eIni);
235 228                 const uint_t uiLangName = cfg.register_string(_T("Info/Lang Name"), _t(""));
236 229                 const uint_t uiFontFace = cfg.register_string(_T("Info/Font Face"), _T(""));
237 230                 const uint_t uiSize = cfg.register_signed_num(_T("Info/Size"), 0, 0, 0xffff);
238 231                 const uint_t uiRTL = cfg.register_bool(_T("Info/RTL reading order"), false);
239 232                 const uint_t uiHelpName = cfg.register_string(_T("Info/Help name"), _T(""));
240 233                 const uint_t uiAuthor = cfg.register_string(_T("Info/Author"), _T(""));
241                   const uint_t uiVersion = cfg.register_string(_T("Info/Version"), _T(""));
242 234                 cfg.read(pszFile);
243 235                 
244 236                 const tchar_t* psz = cfg.get_string(uiLangName);
245 237                 if(!psz || psz[0] == _t('\0'))
246 238                         return false;
247 239                 SetLangName(psz);
248 240
249 241                 psz = cfg.get_string(uiFontFace);
250 242                 if(!psz || psz[0] == _t('\0'))
251 243                         return false;
252 244                 SetFontFace(psz);
253 245
254 246                 ll_t ll = cfg.get_signed_num(uiSize);
255 247                 if(ll == 0)
256 248                         return false;
257 249                 SetPointSize((WORD)ll);
258 250
259 251                 SetDirection(cfg.get_bool(uiRTL));
260 252
261 253                 psz = cfg.get_string(uiHelpName);
262 254                 if(!psz || psz[0] == _t('\0'))
263 255                         return false;
264 256                 SetHelpName(psz);
265 257
266 258                 psz = cfg.get_string(uiAuthor);
267 259                 if(!psz || psz[0] == _t('\0'))
268 260                         return false;
269 261                 SetAuthor(psz);
270 262
271                   psz = cfg.get_string(uiVersion);
272                   if(!psz || psz[0] == _t('\0'))
273                           return false;
274                   SetVersion(psz);
275  
276 263                 SetFilename(pszFile);
277 264
278 265                 return true;
279 266         }
280 267         catch(...)
281 268         {
282 269                 return false;
283 270         }
284 271 }
285 272
286 273 void CLangData::EnumAttributesCallback(bool bGroup, const tchar_t* pszName, const tchar_t* pszValue, ptr_t pData)
287 274 {
288 275         CLangData* pLangData = (CLangData*)pData;
289 276         assert(pLangData);
290 277         assert(pszName);
291 278         if(!pLangData || !pszName)
292 279                 return;
293 280
294 281         if(bGroup && _tcsicmp(pszName, _t("Info")) == 0)
295 282                 return;
 
388 375         }
389 376         *pszOut = _T('\0');
390 377
391 378 }
392 379
393 380 bool CLangData::ReadTranslation(PCTSTR pszFile, bool bUpdateTranslation)
394 381 {
395 382         try
396 383         {
397 384                 if(!bUpdateTranslation)
398 385                         Clear();
399 386
400 387                 // load data from file
401 388                 icpf::config cfg(icpf::config::eIni);
402 389                 const uint_t uiLangName = cfg.register_string(_T("Info/Lang Name"), _t(""));
403 390                 const uint_t uiFontFace = cfg.register_string(_T("Info/Font Face"), _T(""));
404 391                 const uint_t uiSize = cfg.register_signed_num(_T("Info/Size"), 0, 0, 0xffff);
405 392                 const uint_t uiRTL = cfg.register_bool(_T("Info/RTL reading order"), false);
406 393                 const uint_t uiHelpName = cfg.register_string(_T("Info/Help name"), _T(""));
407 394                 const uint_t uiAuthor = cfg.register_string(_T("Info/Author"), _T(""));
408                   const uint_t uiVersion = cfg.register_string(_T("Info/Version"), _T(""));
409 395                 cfg.read(pszFile);
410 396
411 397                 const tchar_t* psz = cfg.get_string(uiLangName);
412 398                 if(!psz || psz[0] == _t('\0'))
413 399                         return false;
414 400                 SetLangName(psz);
415 401
416 402                 psz = cfg.get_string(uiFontFace);
417 403                 if(!psz || psz[0] == _t('\0'))
418 404                         return false;
419 405                 SetFontFace(psz);
420 406
421 407                 ll_t ll = cfg.get_signed_num(uiSize);
422 408                 if(ll == 0)
423 409                         return false;
424 410                 SetPointSize((WORD)ll);
425 411
426 412                 SetDirection(cfg.get_bool(uiRTL));
427 413
428 414                 psz = cfg.get_string(uiHelpName);
429 415                 if(!psz || psz[0] == _t('\0'))
430 416                         return false;
431 417                 SetHelpName(psz);
432 418
433 419                 psz = cfg.get_string(uiAuthor);
434 420                 if(!psz || psz[0] == _t('\0'))
435 421                         return false;
436 422                 SetAuthor(psz);
437 423
438                   psz = cfg.get_string(uiVersion);
439                   if(!psz || psz[0] == _t('\0'))
440                           return false;
441                   SetVersion(psz);
442                   
443 424                 m_bUpdating = bUpdateTranslation;
444 425                 m_uiSectionID = 0;
445 426                 if(!cfg.enum_properties(_t("*"), EnumAttributesCallback, this))
446 427                 {
447 428                         m_bUpdating = false;
448 429                         return false;
449 430                 }
450 431                 m_bUpdating = false;
451 432
452 433                 SetFilename(pszFile);
453 434
454 435                 return true;
455 436         }
456 437         catch(...)
457 438         {
458 439                 return false;
459 440         }
460 441 }
461 442
462 443 void CLangData::WriteTranslation(PCTSTR pszPath)
463 444 {
464 445         const int iBufferSize = 256;
465 446         tchar_t szTemp[iBufferSize];
466 447
467 448         // load data from file
468 449         icpf::config cfg(icpf::config::eIni);
469 450         cfg.set_string(_t("Info/Lang Name"), m_pszLngName);
470 451         cfg.set_string(_T("Info/Font Face"), m_pszFontFace);
471 452         cfg.set_string(_T("Info/Size"), _itot(m_wPointSize, szTemp, 10));
472 453         cfg.set_string(_T("Info/RTL reading order"), m_bRTL ? _T("1") : _T("0"));
473 454         cfg.set_string(_T("Info/Help name"), m_pszHelpName);
474 455         cfg.set_string(_T("Info/Author"), m_pszAuthor);
475           cfg.set_string(_T("Info/Version"), m_pszVersion);
476 456
477 457         tstring_t strText;
478 458         for(translation_map::iterator it = m_mapTranslation.begin(); it != m_mapTranslation.end(); it++)
479 459         {
480 460                 uint_t uiKey = (*it).first;
481 461                 _sntprintf(szTemp, iBufferSize - 1, UIFMT _T("/") UIFMT _T("[") UIXFMT _T("]"), (uiKey >> 16), uiKey & 0x0000ffff, (*it).second.GetChecksum());
482 462
483 463                 strText = (*it).second.GetText();
484 464                 tstring_t::size_type stPos;
485 465                 while((stPos = strText.find_first_of(_t("\r\n\t"))) != tstring_t::npos)
486 466                 {
487 467                         switch(strText[stPos])
488 468                         {
489 469                         case _t('\r'):
490 470                                 strText.replace(stPos, 1, _t("\\r"));
491 471                                 break;
492 472                         case _t('\n'):
493 473                                 strText.replace(stPos, 1, _t("\\n"));
494 474                                 break;
495 475                         case _t('\t'):
 
602 582 {
603 583         if (m_pszFontFace)
604 584                 delete [] m_pszFontFace;
605 585         m_pszFontFace=new TCHAR[_tcslen(psz)+1];
606 586         _tcscpy(m_pszFontFace, psz);
607 587 }
608 588
609 589 void CLangData::SetHelpName(PCTSTR psz)
610 590 {
611 591         SetFnameData(&m_pszHelpName, psz);
612 592 }
613 593
614 594 void CLangData::SetAuthor(PCTSTR psz)
615 595 {
616 596         if (m_pszAuthor)
617 597                 delete [] m_pszAuthor;
618 598         m_pszAuthor=new TCHAR[_tcslen(psz)+1];
619 599         _tcscpy(m_pszAuthor, psz);
620 600 }
621 601
622   void CLangData::SetVersion(PCTSTR psz)
623   {
624           if (m_pszVersion)
625                   delete [] m_pszVersion;
626           m_pszVersion=new TCHAR[_tcslen(psz)+1];
627           _tcscpy(m_pszVersion, psz);
628   }
629  
630 602 void CLangData::SetFnameData(PTSTR *ppszDst, PCTSTR pszSrc)
631 603 {
632 604         if (*ppszDst)
633 605                 delete [] (*ppszDst);
634 606         const TCHAR* pszLast=NULL;
635 607         if ( (pszLast=_tcsrchr(pszSrc, _T('\\'))) != NULL)
636 608                 pszLast++;
637 609         else
638 610                 pszLast=pszSrc;
639 611
640 612         // copy
641 613         *ppszDst=new TCHAR[_tcslen(pszLast)+1];
642 614         _tcscpy(*ppszDst, pszLast);
643 615 }
644 616
645 617 CResourceManager::CResourceManager() :
646 618         m_pfnCallback(NULL),
647 619         m_hRes(NULL)
648 620 {
649 621         InitializeCriticalSection(&m_cs);