Commit 50553b5d authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

kernel32: Open the INI file in PROFILE_DeleteSection().

parent 17a3c096
......@@ -489,30 +489,6 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
/***********************************************************************
* PROFILE_DeleteSection
*
* Delete a section from a profile tree.
*/
static BOOL PROFILE_DeleteSection( PROFILESECTION **section, LPCWSTR name )
{
while (*section)
{
if (!strcmpiW( (*section)->name, name ))
{
PROFILESECTION *to_del = *section;
*section = to_del->next;
to_del->next = NULL;
PROFILE_Free( to_del );
CurProfile->changed = TRUE;
return TRUE;
}
section = &(*section)->next;
}
return TRUE;
}
/***********************************************************************
* PROFILE_DeleteKey
*
* Delete a key from a profile tree.
......@@ -923,6 +899,37 @@ static INT PROFILE_GetSection( const WCHAR *filename, LPCWSTR section_name,
return 0;
}
static BOOL PROFILE_DeleteSection( const WCHAR *filename, const WCHAR *name )
{
PROFILESECTION **section;
EnterCriticalSection( &PROFILE_CritSect );
if (!PROFILE_Open( filename, TRUE ))
{
LeaveCriticalSection( &PROFILE_CritSect );
return FALSE;
}
for (section = &CurProfile->section; *section; section = &(*section)->next)
{
if (!strcmpiW( (*section)->name, name ))
{
PROFILESECTION *to_del = *section;
*section = to_del->next;
to_del->next = NULL;
PROFILE_Free( to_del );
CurProfile->changed = TRUE;
PROFILE_FlushFile();
break;
}
}
LeaveCriticalSection( &PROFILE_CritSect );
return TRUE;
}
/* See GetPrivateProfileSectionNamesA for documentation */
static INT PROFILE_GetSectionNames( LPWSTR buffer, UINT len )
{
......@@ -1317,27 +1324,30 @@ BOOL WINAPI WritePrivateProfileStringW( LPCWSTR section, LPCWSTR entry,
{
BOOL ret = FALSE;
RtlEnterCriticalSection( &PROFILE_CritSect );
if (!section && !entry && !string) /* documented "file flush" case */
{
EnterCriticalSection( &PROFILE_CritSect );
if (!filename || PROFILE_Open( filename, TRUE ))
{
if (CurProfile) PROFILE_ReleaseFile(); /* always return FALSE in this case */
if (CurProfile) PROFILE_ReleaseFile();
}
LeaveCriticalSection( &PROFILE_CritSect );
return FALSE;
}
else if (PROFILE_Open( filename, TRUE ))
if (!entry) return PROFILE_DeleteSection( filename, section );
EnterCriticalSection( &PROFILE_CritSect );
if (PROFILE_Open( filename, TRUE ))
{
if (!section)
SetLastError(ERROR_FILE_NOT_FOUND);
else if (!entry)
ret = PROFILE_DeleteSection( &CurProfile->section, section );
else
ret = PROFILE_SetString( section, entry, string, FALSE);
if (ret) ret = PROFILE_FlushFile();
}
RtlLeaveCriticalSection( &PROFILE_CritSect );
LeaveCriticalSection( &PROFILE_CritSect );
return ret;
}
......@@ -1377,37 +1387,40 @@ BOOL WINAPI WritePrivateProfileSectionW( LPCWSTR section,
BOOL ret = FALSE;
LPWSTR p;
RtlEnterCriticalSection( &PROFILE_CritSect );
if (!section && !string)
{
EnterCriticalSection( &PROFILE_CritSect );
if (!filename || PROFILE_Open( filename, TRUE ))
{
if (CurProfile) PROFILE_ReleaseFile(); /* always return FALSE in this case */
if (CurProfile) PROFILE_ReleaseFile();
}
LeaveCriticalSection( &PROFILE_CritSect );
return FALSE;
}
else if (PROFILE_Open( filename, TRUE )) {
if (!string)
if (!string) return PROFILE_DeleteSection( filename, section );
EnterCriticalSection( &PROFILE_CritSect );
if (PROFILE_Open( filename, TRUE ))
{
PROFILE_DeleteAllKeys(section);
ret = TRUE;
while (*string && ret)
{
ret = PROFILE_DeleteSection( &CurProfile->section, section );
} else {
PROFILE_DeleteAllKeys(section);
ret = TRUE;
while(*string && ret) {
LPWSTR buf = HeapAlloc( GetProcessHeap(), 0, (strlenW(string)+1) * sizeof(WCHAR) );
strcpyW( buf, string );
if((p = strchrW( buf, '='))) {
*p='\0';
ret = PROFILE_SetString( section, buf, p+1, TRUE);
}
HeapFree( GetProcessHeap(), 0, buf );
string += strlenW(string)+1;
WCHAR *buf = HeapAlloc( GetProcessHeap(), 0, (strlenW( string ) + 1) * sizeof(WCHAR) );
strcpyW( buf, string );
if ((p = strchrW( buf, '=')))
{
*p = '\0';
ret = PROFILE_SetString( section, buf, p+1, TRUE );
}
HeapFree( GetProcessHeap(), 0, buf );
string += strlenW( string ) + 1;
}
if (ret) ret = PROFILE_FlushFile();
}
RtlLeaveCriticalSection( &PROFILE_CritSect );
LeaveCriticalSection( &PROFILE_CritSect );
return ret;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment