//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1999 ** //********************************************************************* // // Status.CPP - Header for the implementation of CStatus // // HISTORY: // // 1/27/99 a-jaswed Created. // #include "status.h" #include "appdefs.h" #include "dispids.h" #include "msobmain.h" #include "resource.h" CONST WCHAR GUIDPIDCOMPLETED[] = L"{2B7AF08A-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDTAPICOMPLETED[] = L"{2B7AF08B-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDLANGUAGECOMPLETED[] = L"{2B7AF08C-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDEULACOMPLETED[] = L"{2B7AF08D-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDMOUSETUTORCOMPLETED[] = L"{2B7AF08E-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDUSERINFOPOSTED[] = L"{2B7AF08F-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDUSERINFOSTAMPED[] = L"{2B7AF093-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDOEMINFOCOMPLETED[] = L"{2B7AF090-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDISPSIGNUPCOMPLETED[] = L"{2B7AF091-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDSIGNATURECOMPLETED[] = L"{2B7AF092-C619-11d2-B71B-00C04F794977}"; CONST WCHAR GUIDTIMEZONECOMPLETED[] = L"{23EC9481-C951-11d2-B275-0080C7CF863E}"; DISPATCHLIST StatusExternalInterface[] = { {L"get_PIDCompleted", DISPID_STATUS_GET_PID_COMPLETED }, {L"set_PIDCompleted", DISPID_STATUS_SET_PID_COMPLETED }, {L"get_TAPICompleted", DISPID_STATUS_GET_TAPI_COMPLETED }, {L"set_TAPICompleted", DISPID_STATUS_SET_TAPI_COMPLETED }, {L"get_LanguageCompleted", DISPID_STATUS_GET_LANGUAGE_COMPLETED }, {L"set_LanguageCompleted", DISPID_STATUS_SET_LANGUAGE_COMPLETED }, {L"get_EULACompleted", DISPID_STATUS_GET_EULA_COMPLETED }, {L"set_EULACompleted", DISPID_STATUS_SET_EULA_COMPLETED }, {L"get_MouseTutorCompleted",DISPID_STATUS_GET_MOUSETUTOR_COMPLETED }, {L"set_MouseTutorCompleted",DISPID_STATUS_SET_MOUSETUTOR_COMPLETED }, {L"get_UserInfoPosted", DISPID_STATUS_GET_USERINFO_POSTED }, {L"set_UserInfoPosted", DISPID_STATUS_SET_USERINFO_POSTED }, {L"get_UserInfoStamped", DISPID_STATUS_GET_USERINFO_STAMPED }, {L"set_UserInfoStamped", DISPID_STATUS_SET_USERINFO_STAMPED }, {L"get_OEMInfoCompleted", DISPID_STATUS_GET_OEMINFO_COMPLETED }, {L"set_OEMInfoCompleted", DISPID_STATUS_SET_OEMINFO_COMPLETED }, {L"get_ISPSignupCompleted", DISPID_STATUS_GET_ISPSIGNUP_COMPLETED }, {L"set_ISPSignupCompleted", DISPID_STATUS_SET_ISPSIGNUP_COMPLETED }, {L"get_SignatureCompleted", DISPID_STATUS_GET_SIGNATURE_COMPLETED }, {L"set_SignatureCompleted", DISPID_STATUS_SET_SIGNATURE_COMPLETED }, {L"get_TimeZoneCompleted", DISPID_STATUS_GET_TIMEZONE_COMPLETED }, {L"set_TimeZoneCompleted", DISPID_STATUS_SET_TIMEZONE_COMPLETED }, {L"get_Status", DISPID_STATUS_GET_STATUS }, {L"set_Status", DISPID_STATUS_SET_STATUS } }; ///////////////////////////////////////////////////////////// // CStatus::CStatus CStatus::CStatus(HINSTANCE hInstance) { // Init member vars m_cRef = 0; lstrcpy(m_szRegPath, OOBE_MAIN_REG_KEY); GetString(hInstance, IDS_STATUS_REG_KEY, m_szRegPath + lstrlen(m_szRegPath)); } ///////////////////////////////////////////////////////////// // CStatus::~CStatus CStatus::~CStatus() { assert(m_cRef == 0); } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Status //// HRESULT CStatus::set_Status(LPCWSTR szGUID, LPVARIANT pvBool) { HKEY hKey = NULL; LONG rc = ERROR_SUCCESS; if (VARIANT_TRUE == V_BOOL(pvBool)) { WCHAR szCompletePath[1024]; lstrcpy(szCompletePath, m_szRegPath); lstrcat(szCompletePath, L"\\"); lstrcat(szCompletePath, szGUID); rc = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szCompletePath, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); } else { if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, m_szRegPath, 0, KEY_QUERY_VALUE, &hKey)) RegDeleteKey(hKey, szGUID); } if (NULL != hKey) RegCloseKey(hKey); return (ERROR_SUCCESS == rc ? S_OK : E_FAIL); } HRESULT CStatus::get_Status(LPCWSTR szGUID, LPVARIANT pvBool) { VariantInit(pvBool); V_VT(pvBool) = VT_BOOL; HKEY hKey; WCHAR szCompletePath[1024]; lstrcpy(szCompletePath, m_szRegPath); lstrcat(szCompletePath, L"\\"); lstrcat(szCompletePath, szGUID); if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szCompletePath, 0, KEY_QUERY_VALUE, &hKey)) { V_BOOL(pvBool) = VARIANT_TRUE; RegCloseKey(hKey); } else V_BOOL(pvBool) = VARIANT_FALSE; return (S_OK); } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IUnknown implementation /////// /////// ///////////////////////////////////////////////////////////// // CStatus::QueryInterface STDMETHODIMP CStatus::QueryInterface(REFIID riid, LPVOID* ppvObj) { // must set out pointer parameters to NULL *ppvObj = NULL; if ( riid == IID_IUnknown) { AddRef(); *ppvObj = (IUnknown*)this; return ResultFromScode(S_OK); } if (riid == IID_IDispatch) { AddRef(); *ppvObj = (IDispatch*)this; return ResultFromScode(S_OK); } // Not a supported interface return ResultFromScode(E_NOINTERFACE); } ///////////////////////////////////////////////////////////// // CStatus::AddRef STDMETHODIMP_(ULONG) CStatus::AddRef() { return ++m_cRef; } ///////////////////////////////////////////////////////////// // CStatus::Release STDMETHODIMP_(ULONG) CStatus::Release() { return --m_cRef; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IDispatch implementation /////// /////// ///////////////////////////////////////////////////////////// // CStatus::GetTypeInfo STDMETHODIMP CStatus::GetTypeInfo(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CStatus::GetTypeInfoCount STDMETHODIMP CStatus::GetTypeInfoCount(UINT* pcInfo) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CStatus::GetIDsOfNames STDMETHODIMP CStatus::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) { HRESULT hr = DISP_E_UNKNOWNNAME; rgDispId[0] = DISPID_UNKNOWN; for (int iX = 0; iX < sizeof(StatusExternalInterface)/sizeof(DISPATCHLIST); iX ++) { if(lstrcmp(StatusExternalInterface[iX].szName, rgszNames[0]) == 0) { rgDispId[0] = StatusExternalInterface[iX].dwDispID; hr = NOERROR; break; } } // Set the disid's for the parameters if (cNames > 1) { // Set a DISPID for function parameters for (UINT i = 1; i < cNames ; i++) rgDispId[i] = DISPID_UNKNOWN; } return hr; } ///////////////////////////////////////////////////////////// // CStatus::Invoke HRESULT CStatus::Invoke ( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr ) { HRESULT hr = S_OK; switch(dispidMember) { case DISPID_STATUS_GET_PID_COMPLETED: TRACE(L"DISPID_STATUS_GET_PID_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDPIDCOMPLETED, pvarResult); break; case DISPID_STATUS_GET_TAPI_COMPLETED: TRACE(L"DISPID_STATUS_GET_TAPI_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDTAPICOMPLETED, pvarResult); break; case DISPID_STATUS_GET_LANGUAGE_COMPLETED: TRACE(L"DISPID_STATUS_GET_LANGUAGE_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDLANGUAGECOMPLETED, pvarResult); break; case DISPID_STATUS_GET_EULA_COMPLETED: TRACE(L"DISPID_STATUS_GET_EULA_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDEULACOMPLETED, pvarResult); break; case DISPID_STATUS_GET_MOUSETUTOR_COMPLETED: TRACE(L"DISPID_STATUS_GET_MOUSETUTOR_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDMOUSETUTORCOMPLETED, pvarResult); break; case DISPID_STATUS_GET_USERINFO_POSTED: TRACE(L"DISPID_STATUS_GET_USERINFO_POSTED\n"); if (NULL != pvarResult) get_Status(GUIDUSERINFOPOSTED, pvarResult); break; case DISPID_STATUS_GET_USERINFO_STAMPED: TRACE(L"DISPID_STATUS_GET_USERINFO_STAMPED\n"); if (NULL != pvarResult) get_Status(GUIDUSERINFOSTAMPED, pvarResult); break; case DISPID_STATUS_GET_OEMINFO_COMPLETED: TRACE(L"DISPID_STATUS_GET_OEMINFO_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDOEMINFOCOMPLETED, pvarResult); break; case DISPID_STATUS_GET_ISPSIGNUP_COMPLETED: TRACE(L"DISPID_STATUS_GET_ISPSIGNUP_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDISPSIGNUPCOMPLETED, pvarResult); break; case DISPID_STATUS_GET_SIGNATURE_COMPLETED: TRACE(L"DISPID_STATUS_GET_SIGNATURE_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDSIGNATURECOMPLETED, pvarResult); break; case DISPID_STATUS_GET_TIMEZONE_COMPLETED: TRACE(L"DISPID_STATUS_GET_TIMEZONE_COMPLETED\n"); if (NULL != pvarResult) get_Status(GUIDTIMEZONECOMPLETED, pvarResult); break; case DISPID_STATUS_GET_STATUS: TRACE(L"DISPID_STATUS_GET_STATUS\n"); if (NULL != pdispparams && NULL != pvarResult && 0 < pdispparams->cArgs) get_Status(V_BSTR(pdispparams->rgvarg), pvarResult); break; case DISPID_STATUS_SET_PID_COMPLETED: TRACE(L"DISPID_STATUS_SET_PID_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDPIDCOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_TAPI_COMPLETED: TRACE(L"DISPID_STATUS_SET_TAPI_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDTAPICOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_LANGUAGE_COMPLETED: TRACE(L"DISPID_STATUS_SET_LANGUAGE_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDLANGUAGECOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_EULA_COMPLETED: TRACE(L"DISPID_STATUS_SET_EULA_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDEULACOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_MOUSETUTOR_COMPLETED: TRACE(L"DISPID_STATUS_SET_MOUSETUTOR_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDMOUSETUTORCOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_USERINFO_POSTED: TRACE(L"DISPID_STATUS_SET_USERINFO_POSTED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDUSERINFOPOSTED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_USERINFO_STAMPED: TRACE(L"DISPID_STATUS_SET_USERINFO_STAMPED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDUSERINFOSTAMPED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_OEMINFO_COMPLETED: TRACE(L"DISPID_STATUS_SET_OEMINFO_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDOEMINFOCOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_ISPSIGNUP_COMPLETED: TRACE(L"DISPID_STATUS_SET_ISPSIGNUP_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDISPSIGNUPCOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_SIGNATURE_COMPLETED: TRACE(L"DISPID_STATUS_SET_SIGNATURE_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDSIGNATURECOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_TIMEZONE_COMPLETED: TRACE(L"DISPID_STATUS_SET_TIMEZONE_COMPLETED\n"); if (NULL != pdispparams && 0 < pdispparams->cArgs) set_Status(GUIDTIMEZONECOMPLETED, pdispparams->rgvarg); break; case DISPID_STATUS_SET_STATUS: TRACE(L"DISPID_STATUS_SET_STATUS\n"); if (NULL != pdispparams && 1 < pdispparams->cArgs) set_Status(V_BSTR(&pdispparams->rgvarg[1]), &pdispparams->rgvarg[0]); break; default: { hr = DISP_E_MEMBERNOTFOUND; break; } } return hr; }