git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49267
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
+- Allow loading message catalogs from wxFileSystem (Axel Gembe)
- Added support for user-defined types to wxConfig (Marcin Wojdyr).
- Added wxJoin() and wxSplit() functions (Francesco Montorsi).
- Added wxMutex::LockTimeout() (Aleksandr Napylov).
- Added support for user-defined types to wxConfig (Marcin Wojdyr).
- Added wxJoin() and wxSplit() functions (Francesco Montorsi).
- Added wxMutex::LockTimeout() (Aleksandr Napylov).
#include "wx/apptrait.h"
#include "wx/stdpaths.h"
#include "wx/hashset.h"
#include "wx/apptrait.h"
#include "wx/stdpaths.h"
#include "wx/hashset.h"
#if defined(__WXMAC__)
#include "wx/mac/private.h" // includes mac headers
#if defined(__WXMAC__)
#include "wx/mac/private.h" // includes mac headers
ofsHashTable; // +18: offset of hash table start
};
ofsHashTable; // +18: offset of hash table start
};
- // all data is stored here, NULL if no data loaded
- size_t8 *m_pData;
-
- // amount of memory pointed to by m_pData.
- size_t32 m_nSize;
+ // all data is stored here
+ wxMemoryBuffer m_data;
// data description
size_t32 m_numStrings; // number of strings in this domain
// data description
size_t32 m_numStrings; // number of strings in this domain
+ // just return the pointer to the start of the data as "char *" to
+ // facilitate doing pointer arithmetic with it
+ char *StringData() const
+ {
+ return wx_static_cast(char *, m_data.GetData());
+ }
+
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
{
const wxMsgTableEntry * const ent = pTable + n;
// this check could fail for a corrupt message catalog
size_t32 ofsString = Swap(ent->ofsString);
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 n) const
{
const wxMsgTableEntry * const ent = pTable + n;
// this check could fail for a corrupt message catalog
size_t32 ofsString = Swap(ent->ofsString);
- if ( ofsString + Swap(ent->nLen) > m_nSize)
+ if ( ofsString + Swap(ent->nLen) > m_data.GetDataLen())
- return (const char *)(m_pData + ofsString);
+ return StringData() + ofsString;
}
bool m_bSwapped; // wrong endianness?
}
bool m_bSwapped; // wrong endianness?
wxMsgCatalogFile::wxMsgCatalogFile()
{
wxMsgCatalogFile::wxMsgCatalogFile()
{
- m_pData = NULL;
- m_nSize = 0;
}
wxMsgCatalogFile::~wxMsgCatalogFile()
{
}
wxMsgCatalogFile::~wxMsgCatalogFile()
{
}
// return the directories to search for message catalogs under the given
}
// return the directories to search for message catalogs under the given
wxFileName fn(szName);
fn.SetExt(_T("mo"));
wxFileName fn(szName);
fn.SetExt(_T("mo"));
- if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) ) {
+#if wxUSE_FILESYSTEM
+ wxFileSystem fileSys;
+ if ( !fileSys.FindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+#else // !wxUSE_FILESYSTEM
+ if ( !wxFindFileInPath(&strFullName, searchPath, fn.GetFullPath()) )
+#endif // wxUSE_FILESYSTEM/!wxUSE_FILESYSTEM
+ {
wxLogVerbose(_("catalog file for domain '%s' not found."), szName);
wxLogTrace(TRACE_I18N, _T("Catalog \"%s.mo\" not found"), szName);
return false;
}
wxLogVerbose(_("catalog file for domain '%s' not found."), szName);
wxLogTrace(TRACE_I18N, _T("Catalog \"%s.mo\" not found"), szName);
return false;
}
+ // open file and read its data
wxLogVerbose(_("using catalog '%s' from '%s'."), szName, strFullName.c_str());
wxLogTrace(TRACE_I18N, _T("Using catalog \"%s\"."), strFullName.c_str());
wxLogVerbose(_("using catalog '%s' from '%s'."), szName, strFullName.c_str());
wxLogTrace(TRACE_I18N, _T("Using catalog \"%s\"."), strFullName.c_str());
+#if wxUSE_FILESYSTEM
+ wxFSFile * const fileMsg = fileSys.OpenFile(strFullName);
+ if ( !fileMsg )
+ return false;
+
+ wxInputStream *fileStream = fileMsg->GetStream();
+ m_data.SetDataLen(0);
+
+ static const size_t chunkSize = 4096;
+ while ( !fileStream->Eof() ) {
+ fileStream->Read(m_data.GetAppendBuf(chunkSize), chunkSize);
+ m_data.UngetAppendBuf(fileStream->LastRead());
+ }
+
+ delete fileMsg;
+#else // !wxUSE_FILESYSTEM
wxFile fileMsg(strFullName);
if ( !fileMsg.IsOpened() )
return false;
wxFile fileMsg(strFullName);
if ( !fileMsg.IsOpened() )
return false;
wxASSERT_MSG( nSize == lenFile + size_t(0), _T("message catalog bigger than 4GB?") );
// read the whole file in memory
wxASSERT_MSG( nSize == lenFile + size_t(0), _T("message catalog bigger than 4GB?") );
// read the whole file in memory
- m_pData = new size_t8[nSize];
- if ( fileMsg.Read(m_pData, nSize) != lenFile ) {
- wxDELETEA(m_pData);
+ if ( fileMsg.Read(m_data.GetWriteBuf(nSize), nSize) != lenFile )
+#endif // wxUSE_FILESYSTEM/!wxUSE_FILESYSTEM
+
- bool bValid = nSize + (size_t)0 > sizeof(wxMsgCatalogHeader);
+ bool bValid = m_data.GetDataLen() > sizeof(wxMsgCatalogHeader);
- wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData;
+ const wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_data.GetData();
if ( bValid ) {
// we'll have to swap all the integers if it's true
m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
if ( bValid ) {
// we'll have to swap all the integers if it's true
m_bSwapped = pHeader->magic == MSGCATALOG_MAGIC_SW;
// it's either too short or has incorrect magic number
wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
// it's either too short or has incorrect magic number
wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
return false;
}
// initialize
m_numStrings = Swap(pHeader->numStrings);
return false;
}
// initialize
m_numStrings = Swap(pHeader->numStrings);
- m_pOrigTable = (wxMsgTableEntry *)(m_pData +
+ m_pOrigTable = (wxMsgTableEntry *)(StringData() +
Swap(pHeader->ofsOrigTable));
Swap(pHeader->ofsOrigTable));
- m_pTransTable = (wxMsgTableEntry *)(m_pData +
+ m_pTransTable = (wxMsgTableEntry *)(StringData() +
Swap(pHeader->ofsTransTable));
Swap(pHeader->ofsTransTable));
- m_nSize = (size_t32)nSize;
// now parse catalog's header and try to extract catalog charset and
// plural forms formula from it:
// now parse catalog's header and try to extract catalog charset and
// plural forms formula from it: