Skip to content
Snippets Groups Projects
  • Nat Goodspeed's avatar
    5002bf56
    MAINT-8087: Use env vars from VMP for AppData\Roaming and Local. · 5002bf56
    Nat Goodspeed authored
    On Windows, when logged in with a non-ASCII username, every one of the three
    documented APIs -- SHGetSpecialFolderPath(), SHGetFolderPath() and
    SHGetKnownFolderPath() -- fails to retrieve any pathname at all. We cannot
    account for the fact that the oldest of these continues to work with the
    release viewer and within a Python script (though not, curiously, from a
    Python interactive session). With a non-ASCII username, they consistently fail
    when called from an Alex Ivy viewer build: "The filename, directory name, or
    volume label syntax is incorrect."
    
    Empirically, with a non-ASCII username, the preset APPDATA and LOCALAPPDATA
    environment variables are also useless, e.g. c:\Users\??????\AppData\Roaming
    where those are, yup, actual question marks.
    
    Empirically, the VMP is able to successfully call SHGetFolderPath() to
    retrieve both AppData\Roaming and AppData\Local. Therefore, we make the VMP
    set the APPDATA and LOCALAPPDATA environment variables to the UTF-8 encoded
    correct pathnames. Instead of calling SHGetSomethingFolderPath() at all, make
    LLDir_Win32 retrieve those environment variables.
    
    Make LLFile::mkdir() treat "directory already exists" as a success case. Every
    single call fell into one of two categories: either it didn't check success at
    all, or it tested specially to exempt errno == EEXIST. Migrate that test into
    mkdir(); eliminate it from call sites.
    
    Make LLDir::append() and add() convenience functions accept variadic
    arguments. Replace add(add()...) constructs, as well as clumsy concatenations
    of directory names and getDirDelimiter(), with simple variadic add() calls.
    5002bf56
    History
    MAINT-8087: Use env vars from VMP for AppData\Roaming and Local.
    Nat Goodspeed authored
    On Windows, when logged in with a non-ASCII username, every one of the three
    documented APIs -- SHGetSpecialFolderPath(), SHGetFolderPath() and
    SHGetKnownFolderPath() -- fails to retrieve any pathname at all. We cannot
    account for the fact that the oldest of these continues to work with the
    release viewer and within a Python script (though not, curiously, from a
    Python interactive session). With a non-ASCII username, they consistently fail
    when called from an Alex Ivy viewer build: "The filename, directory name, or
    volume label syntax is incorrect."
    
    Empirically, with a non-ASCII username, the preset APPDATA and LOCALAPPDATA
    environment variables are also useless, e.g. c:\Users\??????\AppData\Roaming
    where those are, yup, actual question marks.
    
    Empirically, the VMP is able to successfully call SHGetFolderPath() to
    retrieve both AppData\Roaming and AppData\Local. Therefore, we make the VMP
    set the APPDATA and LOCALAPPDATA environment variables to the UTF-8 encoded
    correct pathnames. Instead of calling SHGetSomethingFolderPath() at all, make
    LLDir_Win32 retrieve those environment variables.
    
    Make LLFile::mkdir() treat "directory already exists" as a success case. Every
    single call fell into one of two categories: either it didn't check success at
    all, or it tested specially to exempt errno == EEXIST. Migrate that test into
    mkdir(); eliminate it from call sites.
    
    Make LLDir::append() and add() convenience functions accept variadic
    arguments. Replace add(add()...) constructs, as well as clumsy concatenations
    of directory names and getDirDelimiter(), with simple variadic add() calls.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.