//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1997.
//
//  File:       Reg.cpp
//
//  Contents:   Registration Routines
//
//  Classes:    
//
//  Notes:      
//
//  History:    05-Nov-97   rogerg      Created.
//
//--------------------------------------------------------------------------

#include "precomp.h"




//--------------------------------------------------------------------------------
//
//  FUNCTION: GetLastIdleHandler()
//
//  PURPOSE:  returns last handler synchronized on an Idle
//
//
//--------------------------------------------------------------------------------

STDMETHODIMP GetLastIdleHandler(CLSID *clsidHandler)
{
HRESULT hr = E_UNEXPECTED;
HKEY hkeyIdle;
WCHAR wszGuid[GUID_SIZE];
TCHAR *pszGuid;
DWORD dwDataSize;
#ifndef _UNICODE
TCHAR szGuid[GUID_SIZE];
#endif // _UNICODE

    #ifdef _UNICODE
        dwDataSize = sizeof(wszGuid);
        pszGuid = wszGuid;
    #else
        dwDataSize = sizeof(szGuid);
        pszGuid = szGuid;
    #endif
     

   // write out the Handler to the Registry.
    if (ERROR_SUCCESS == RegCreateKeyExXp(HKEY_CURRENT_USER, 
                            IDLESYNC_REGKEY,0,NULL,
                            REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE,NULL,&hkeyIdle,
                            NULL,FALSE /*fSetSecurity*/))
    {
    DWORD dwType;

        dwType = REG_SZ;

        hr = RegQueryValueEx(hkeyIdle,SZ_IDLELASTHANDLERKEY
                             ,NULL, &dwType ,  
			     (LPBYTE) pszGuid,
			     &dwDataSize);

        RegCloseKey(hkeyIdle);
    }
    else
    {
        return S_FALSE;
    }

    if (hr != ERROR_SUCCESS)
    {
        hr = S_FALSE;
        return hr;
    }

#ifndef _UNICODE
    MultiByteToWideChar(CP_ACP ,0,szGuid,-1,wszGuid,GUID_SIZE);
#endif // _UNICODE

    return CLSIDFromString(wszGuid,clsidHandler);
}

//--------------------------------------------------------------------------------
//
//  FUNCTION: SetLastIdleHandler()
//
//  PURPOSE:  sets the last handler synchronized on an Idle
//
//
//--------------------------------------------------------------------------------

STDMETHODIMP SetLastIdleHandler(REFCLSID clsidHandler)
{
HRESULT hr = E_UNEXPECTED;
HKEY hkeyIdle;
WCHAR wszGuid[GUID_SIZE];
TCHAR *pszGuid;
DWORD dwDataSize;
#ifndef _UNICODE
TCHAR szGuid[GUID_SIZE];
#endif // _UNICODE

    
    if (0 == StringFromGUID2(clsidHandler,wszGuid, GUID_SIZE))
    {
        AssertSz(0,"SetLastIdleHandler Failed");
        return E_UNEXPECTED;
    }

#ifdef _UNICODE
    pszGuid = wszGuid;
    dwDataSize = sizeof(wszGuid);
#else
    BOOL fUsedDefaultChar;

    WideCharToMultiByte(CP_ACP ,0,wszGuid,
				    -1,szGuid,GUID_SIZE,
				    NULL,&fUsedDefaultChar);

    pszGuid = szGuid;
    dwDataSize = GUID_SIZE * sizeof(TCHAR);
#endif // _UNICODE

    // write out the Handler to the Registry.
    if (ERROR_SUCCESS ==  RegCreateKeyExXp(HKEY_CURRENT_USER, 
                            IDLESYNC_REGKEY,0,NULL,
                            REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkeyIdle,
                            NULL,FALSE /*fSetSecurity*/))
    {

        hr = RegSetValueEx(hkeyIdle,SZ_IDLELASTHANDLERKEY
                             ,NULL, REG_SZ ,  
			     (LPBYTE) pszGuid,
			     dwDataSize);

        RegCloseKey(hkeyIdle);
    }


    return hr;
}