#include <stdlib.h>
#include <ctype.h>
+// headers needed for umask()
+#ifdef __UNIX__
+ #include <sys/types.h>
+ #include <sys/stat.h>
+#endif // __UNIX__
+
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
}
}
+ SetUmask(-1);
+
Init();
}
break;
default:
- wxLogWarning(_("file '%s', line %d: '%s' "
- "ignored after group header."),
+ wxLogWarning(_("file '%s', line %d: '%s' ignored after group header."),
file.GetName(), n + 1, pEnd);
bCont = FALSE;
}
}
else { // a key
const wxChar *pEnd = pStart;
- while ( *pEnd != wxT('=') && !wxIsspace(*pEnd) ) {
+ while ( *pEnd && *pEnd != wxT('=') && !wxIsspace(*pEnd) ) {
if ( *pEnd == wxT('\\') ) {
// next character may be space or not - still take it because it's
- // quoted
+ // quoted (unless there is nothing)
pEnd++;
+ if ( !*pEnd ) {
+ // the error message will be given below anyhow
+ break;
+ }
}
pEnd++;
wxString strKey(FilterInEntryName(wxString(pStart, pEnd)));
// skip whitespace
- while ( isspace(*pEnd) )
+ while ( wxIsspace(*pEnd) )
pEnd++;
if ( *pEnd++ != wxT('=') ) {
else {
if ( bLocal && pEntry->IsImmutable() ) {
// immutable keys can't be changed by user
- wxLogWarning(_("file '%s', line %d: value for "
- "immutable key '%s' ignored."),
+ wxLogWarning(_("file '%s', line %d: value for immutable key '%s' ignored."),
file.GetName(), n + 1, strKey.c_str());
continue;
}
// (c) key from global file now found in local one
// which is exactly what we want.
else if ( !bLocal || pEntry->IsLocal() ) {
- wxLogWarning(_("file '%s', line %d: key '%s' was first "
- "found at line %d."),
+ wxLogWarning(_("file '%s', line %d: key '%s' was first found at line %d."),
file.GetName(), n + 1, strKey.c_str(), pEntry->Line());
if ( bLocal )
if (pEntry == NULL) {
return FALSE;
}
- else {
- *pStr = ExpandEnvVars(pEntry->Value());
- return TRUE;
- }
+
+ *pStr = ExpandEnvVars(pEntry->Value());
+ return TRUE;
}
bool wxFileConfig::Read(const wxString& key,
wxConfigPathChanger path(this, key);
ConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name());
+ bool ok;
if (pEntry == NULL) {
if( IsRecordingDefaults() )
((wxFileConfig *)this)->Write(key,defVal);
*pStr = ExpandEnvVars(defVal);
- return FALSE;
+ ok = FALSE;
}
else {
*pStr = ExpandEnvVars(pEntry->Value());
- return TRUE;
+ ok = TRUE;
}
+
+ return ok;
}
bool wxFileConfig::Read(const wxString& key, long *pl) const
{
wxString str;
- if ( Read(key, & str) ) {
- *pl = wxAtol(str);
- return TRUE;
- }
- else {
+ if ( !Read(key, & str) )
+ {
return FALSE;
}
+
+ *pl = wxAtol(str);
+ return TRUE;
}
bool wxFileConfig::Write(const wxString& key, const wxString& szValue)
if ( LineListIsEmpty() || !m_pRootGroup->IsDirty() || !m_strLocalFile )
return TRUE;
+#ifdef __UNIX__
+ // set the umask if needed
+ mode_t umaskOld = 0;
+ if ( m_umask != -1 )
+ {
+ umaskOld = umask((mode_t)m_umask);
+ }
+#endif // __UNIX__
+
wxTempFile file(m_strLocalFile);
if ( !file.IsOpened() ) {
}
}
-#ifndef __WXMAC__
- return file.Commit();
-#else
bool ret = file.Commit();
+
+#ifdef __WXMAC__
if ( ret )
{
FSSpec spec ;
FSpSetFInfo( &spec , &finfo ) ;
}
}
- return ret ;
-#endif
+#endif // __WXMAC__
+
+#ifdef __UNIX__
+ // restore the old umask if we changed it
+ if ( m_umask != -1 )
+ {
+ (void)umask(umaskOld);
+ }
+#endif // __UNIX__
+
+ return ret;
}
// ----------------------------------------------------------------------------
{
CleanUp();
- if ( remove(m_strLocalFile.fn_str()) == -1 )
+ if ( wxRemove(m_strLocalFile) == -1 )
wxLogSysError(_("can't delete user configuration file '%s'"), m_strLocalFile.c_str());
m_strLocalFile = m_strGlobalFile = wxT("");