kernel32: Open the INI file in PROFILE_DeleteSection().

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2020-06-28 13:51:18 -05:00 committed by Alexandre Julliard
parent 17a3c0964d
commit 50553b5db1
1 changed files with 63 additions and 50 deletions

View File

@ -488,30 +488,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
*
@ -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;
}