void createDirectory()

in src/main/cpp/launcher/windows/src/FileUtils.c [276:332]


void createDirectory(LauncherProperties * props, WCHAR * directory) {
    
    WCHAR * parent;
    // now directory is the absolute path with normalized slashes
    writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "Getting parent directory of ", 0);
    writeMessageW(props, OUTPUT_LEVEL_DEBUG, 0, directory, 1);
    
    parent = getParentDirectory(directory);
    
    if(parent!=NULL) {
        writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "    parent = ", 0);
        writeMessageW(props, OUTPUT_LEVEL_DEBUG, 0, parent, 1);
        
        if(!fileExists(parent)) {
            writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "... doesn`t exist. Create it...", 1);
            createDirectory(props, parent);
        } else {
            writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "    ... exist. ", 1);
        }
        if(isOK(props)) {
            DWORD parentAttrs = GetFileAttributesW(parent);
            if(parentAttrs == INVALID_FILE_ATTRIBUTES) {
                props-> status = ERROR_INPUTOUPUT;
            } else  {
                SECURITY_ATTRIBUTES secattr;
                int64t * minSize = newint64_t(0, 0);
                
                secattr.nLength = sizeof(SECURITY_ATTRIBUTES);
                secattr.lpSecurityDescriptor = 0;
                secattr.bInheritHandle = 1;
                writeMessageA(props, OUTPUT_LEVEL_DEBUG, 1, "... creating directory itself... ", 0);
                writeMessageW(props, OUTPUT_LEVEL_DEBUG, 1, directory, 1);
                
                checkFreeSpace(props, parent, minSize);
                FREE(minSize);
                
                if(isOK(props)) {
                    props->status = (CreateDirectoryExW(parent, directory, &secattr)) ? ERROR_OK : ERROR_INPUTOUPUT;
                    if(!isOK(props)) {
                        props->status = (CreateDirectoryW(directory, &secattr)) ? ERROR_OK : ERROR_INPUTOUPUT;
                    }
                    props->status = (fileExists(directory)) ? ERROR_OK : ERROR_INPUTOUPUT;
                    
                    if(isOK(props)) {
                        SetFileAttributesW(directory, parentAttrs);
                    } else {
                        writeErrorA(props, OUTPUT_LEVEL_DEBUG, 1, "Error! Can`t create directory : ", directory, GetLastError());
                    }
                }
            }
        }
        FREE(parent);
    } else {
        writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "    parent is NULL ", 1);
        props-> status = ERROR_INPUTOUPUT;
    }
}