// License GPLv2+

#include "registry.hpp"

QVLCRegistry::QVLCRegistry(HKEY rootKey)
{
    this->m_RootKey = rootKey;
}

QVLCRegistry::~QVLCRegistry(void)
{
}

int QVLCRegistry::RegistryKeyExists(char *path) {
    HKEY keyHandle;
    if( RegOpenKeyEx(m_RootKey, path, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) {
        RegCloseKey(keyHandle);
        return 1;
    }
    return 0;
}

int QVLCRegistry::RegistryValueExists(char *path, char *valueName) {
    HKEY keyHandle;
    int temp = 0;
    DWORD size1;
    DWORD valueType;

    if( RegOpenKeyEx(m_RootKey, path, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) {
        if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, NULL, &size1) == ERROR_SUCCESS) {
           temp = 1;
        }
        RegCloseKey(keyHandle);
    }
    return temp;
}

void QVLCRegistry::WriteRegistryInt(char *path, char *valueName, int value) {
    HKEY keyHandle;

    if( RegCreateKeyEx(m_RootKey, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &keyHandle, NULL)  == ERROR_SUCCESS) {
        RegSetValueEx(keyHandle,valueName,0,REG_DWORD,(LPBYTE)&value,sizeof(int));
        RegCloseKey(keyHandle);
    }

}

void QVLCRegistry::WriteRegistryString(char *path, char *valueName, char *value) {
    HKEY keyHandle;

    if( RegCreateKeyEx(m_RootKey, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &keyHandle, NULL)  == ERROR_SUCCESS) {
        RegSetValueEx(keyHandle,valueName,0,REG_SZ,(LPBYTE)value,(DWORD)(strlen(value)+1));
        RegCloseKey(keyHandle);
    }
}

void QVLCRegistry::WriteRegistryDouble(char *path, char *valueName, double value) {
    HKEY keyHandle;
    if( RegCreateKeyEx(m_RootKey, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &keyHandle, NULL)  == ERROR_SUCCESS) {
        RegSetValueEx(keyHandle,valueName,0,REG_BINARY,(LPBYTE)&value,sizeof(double));
        RegCloseKey(keyHandle);
    }
}

int QVLCRegistry::ReadRegistryInt(char *path, char *valueName, int default_value) {
    HKEY keyHandle;
    int tempValue;
    DWORD size1;
    DWORD valueType;

    if( RegOpenKeyEx(m_RootKey, path, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) {
        if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, NULL, &size1) == ERROR_SUCCESS) {
           if(valueType == REG_DWORD) {
               if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, (LPBYTE)&tempValue, &size1) == ERROR_SUCCESS) {
                  default_value = tempValue;
               };
           }
        }
        RegCloseKey(keyHandle);
    }
    return default_value;
}

char * QVLCRegistry::ReadRegistryString(char *path, char *valueName, char *default_value) {
    HKEY keyHandle;
    char *tempValue = NULL;
    DWORD size1;
    DWORD valueType;

    if( RegOpenKeyEx(m_RootKey, path, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) {
        if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, NULL, &size1) == ERROR_SUCCESS) {
           if(valueType == REG_SZ) {
               // free
               tempValue = (char *)malloc(size1+1); // +1 für NullByte`?
               if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, (LPBYTE)tempValue, &size1) == ERROR_SUCCESS) {
                  default_value = tempValue;
               };
           }
        }
        RegCloseKey(keyHandle);
    }
    if(tempValue == NULL)  {
        // wenn tempValue nicht aus registry gelesen wurde dafür sorgen das ein neuer String mit der Kopie von DefaultValue
        // geliefert wird - das macht das Handling des Rückgabewertes der Funktion einfacher - immer schön mit free freigeben!
        default_value = strdup(default_value);
    }

    return default_value;
}

double QVLCRegistry::ReadRegistryDouble(char *path, char *valueName, double default_value) {
    HKEY keyHandle;
    double tempValue;
    DWORD size1;
    DWORD valueType;

    if( RegOpenKeyEx(m_RootKey, path, 0, KEY_READ, &keyHandle) == ERROR_SUCCESS) {
        if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, NULL, &size1) == ERROR_SUCCESS) {
           if((valueType == REG_BINARY) && (size1 == sizeof(double))) {
               if(RegQueryValueEx( keyHandle, valueName, NULL, &valueType, (LPBYTE)&tempValue, &size1) == ERROR_SUCCESS) {
                  default_value = tempValue;
               };
           }
        }
        RegCloseKey(keyHandle);
    }
    return default_value;
}
