//* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1999 ** //********************************************************************* // // MSOBMAIN.CPP - Header for the implementation of CObMain // // HISTORY: // // 1/27/99 a-jaswed Created. // // Class which will provide the an IOleSite to the WebOC #include "userinfo.h" #include "appdefs.h" #include "dispids.h" #include "windowsx.h" #include "msobmain.h" #include "pid.h" #include "msobmain.h" #include "resource.h" #include "shlwapi.h" #define USER_INFO_INIFILE OEMINFO_INI_FILENAME #define USER_COMP_MANF_SEC L"General" #define USER_COMP_MANF_KEY L"Manufacturer" #define USERINFO_REG_KEY_FIRSTNAME L"FirstName" #define USERINFO_REG_KEY_MIDDLEINITIAL L"MiddleInitial" #define USERINFO_REG_KEY_LASTNAME L"LastName" #define USERINFO_REG_KEY_FURIGANANAME L"FuriganaName" #define USERINFO_REG_KEY_COMPANYNAME L"CompanyName" #define USERINFO_REG_KEY_ADDRESS1 L"Address1" #define USERINFO_REG_KEY_ADDRESS2 L"Address2" #define USERINFO_REG_KEY_CITY L"City" #define USERINFO_REG_KEY_STATE L"State" #define USERINFO_REG_KEY_ZIP L"Zip" #define USERINFO_REG_KEY_COUNTRY L"Country" #define USERINFO_REG_KEY_PRIMARYEMAIL L"PrimaryEmail" #define USERINFO_REG_KEY_SECONDARYEMAIL L"SecondaryEmail" #define USERINFO_REG_KEY_AREACODE L"AreaCode" #define USERINFO_REG_KEY_PHONENUMBER L"PhoneNumber" #define USERINFO_REG_KEY_IDENTITY L"Identity" #define USERINFO_REG_KEY_OWNERNAME L"OwnerName" #define USERINFO_REG_KEY_DEFAULTNEWUSER L"DefaultNewUser" #define DEFAULT_USEIDENTITIES TRUE DISPATCHLIST UserInfoExternalInterface[] = { {L"get_FirstName", DISPID_USERINFO_GET_FIRSTNAME }, {L"set_FirstName", DISPID_USERINFO_SET_FIRSTNAME }, {L"get_MiddleInitial", DISPID_USERINFO_GET_MIDDLEINITIAL }, {L"set_MiddleInitial", DISPID_USERINFO_SET_MIDDLEINITIAL }, {L"get_LastName", DISPID_USERINFO_GET_LASTNAME }, {L"set_LastName", DISPID_USERINFO_SET_LASTNAME }, {L"get_FuriganaName", DISPID_USERINFO_GET_FURIGANANAME }, {L"set_FuriganaName", DISPID_USERINFO_SET_FURIGANANAME }, {L"get_CompanyName", DISPID_USERINFO_GET_COMPANYNAME }, {L"set_CompanyName", DISPID_USERINFO_SET_COMPANYNAME }, {L"get_Address1", DISPID_USERINFO_GET_ADDRESS1 }, {L"set_Address1", DISPID_USERINFO_SET_ADDRESS1 }, {L"get_Address2", DISPID_USERINFO_GET_ADDRESS2 }, {L"set_Address2", DISPID_USERINFO_SET_ADDRESS2 }, {L"get_City", DISPID_USERINFO_GET_CITY }, {L"set_City", DISPID_USERINFO_SET_CITY }, {L"get_State", DISPID_USERINFO_GET_STATE }, {L"set_State", DISPID_USERINFO_SET_STATE }, {L"get_Zip", DISPID_USERINFO_GET_ZIP }, {L"set_Zip", DISPID_USERINFO_SET_ZIP }, {L"get_Country", DISPID_USERINFO_GET_COUNTRY }, {L"set_Country", DISPID_USERINFO_SET_COUNTRY }, {L"get_CountryID", DISPID_USERINFO_GET_COUNTRYID }, {L"set_CountryID", DISPID_USERINFO_SET_COUNTRYID }, {L"get_PrimaryEmail", DISPID_USERINFO_GET_PRIMARYEMAIL }, {L"set_PrimaryEmail", DISPID_USERINFO_SET_PRIMARYEMAIL }, {L"get_SecondaryEmail", DISPID_USERINFO_GET_SECONDARYEMAIL }, {L"set_SecondaryEmail", DISPID_USERINFO_SET_SECONDARYEMAIL }, {L"get_AreaCode", DISPID_USERINFO_GET_AREACODE }, {L"set_AreaCode", DISPID_USERINFO_SET_AREACODE }, {L"get_PhoneNumber", DISPID_USERINFO_GET_PHONENUMBER }, {L"set_PhoneNumber", DISPID_USERINFO_SET_PHONENUMBER }, {L"get_MSUpdate", DISPID_USERINFO_GET_MSUPDATE }, {L"set_MSUpdate", DISPID_USERINFO_SET_MSUPDATE }, {L"get_MSOffer", DISPID_USERINFO_GET_MSOFFER }, {L"set_MSOffer", DISPID_USERINFO_SET_MSOFFER }, {L"get_OtherOffer", DISPID_USERINFO_GET_OTHEROFFER }, {L"set_OtherOffer", DISPID_USERINFO_SET_OTHEROFFER }, {L"get_Identity", DISPID_USERINFO_GET_IDENTITY }, {L"set_Identity", DISPID_USERINFO_SET_IDENTITY }, {L"get_IdentitiesMax", DISPID_USERINFO_GET_IDENTITIESMAX }, {L"check_Identity", DISPID_USERINFO_CHECK_IDENTITY }, {L"SuggestIdentity0", DISPID_USERINFO_SUGGESTIDENTITY0 }, {L"get_UseIdentities", DISPID_USERINFO_GET_USEIDENTITIES }, {L"set_UseIdentities", DISPID_USERINFO_SET_USEIDENTITIES }, {L"get_OEMIdentities", DISPID_USERINFO_GET_OEMIDENTITIES }, {L"get_OwnerName", DISPID_USERINFO_GET_OWNERNAME }, {L"set_OwnerName", DISPID_USERINFO_SET_OWNERNAME }, {L"get_DefaultNewUser", DISPID_USERINFO_GET_DEFAULTNEWUSER }, }; const WCHAR csz_ADDR1[] = L"Addr1"; const WCHAR csz_ADDR2[] = L"Addr2"; const WCHAR csz_ADDRTYPE[] = L"AddrType"; const WCHAR csz_AREACODE[] = L"AreaCode"; const WCHAR csz_CITY[] = L"City"; const WCHAR csz_COMPANYNAME[] = L"CompanyName"; const WCHAR csz_COUNTRYCODE[] = L"CountryCode"; const WCHAR csz_DIVISIONNAME[] = L"DivisionName"; const WCHAR csz_EMAILNAME[] = L"EmailName"; const WCHAR csz_EXTENSION[] = L"Extension"; const WCHAR csz_FNAME[] = L"FName"; const WCHAR csz_INFLUENCELEVEL[] = L"InfluenceLevel"; const WCHAR csz_LANGCODE[] = L"LangCode"; const WCHAR csz_LANGNAME[] = L"LangName"; const WCHAR csz_LNAME[] = L"LName"; const WCHAR csz_MNAME[] = L"MName"; const WCHAR csz_NOOTHER[] = L"NoOther"; const WCHAR csz_PHONE[] = L"Phone"; const WCHAR csz_PID[] = L"PID"; const WCHAR csz_PRODUCT[] = L"Product"; const WCHAR csz_REGWIZVER[] = L"RegWizVer"; const WCHAR csz_SOFTWAREROLE[] = L"SoftwareRole"; const WCHAR csz_STATE[] = L"State"; const WCHAR csz_USERID[] = L"UserID"; const WCHAR csz_ZIP[] = L"Zip"; const WCHAR CSZ_COMPUTERMANF[] = L"ComputerManf"; REGDATAELEMENT aryRegDataElements[] = { { csz_ADDR1, NULL, 0}, { csz_ADDR2, NULL, 0}, { csz_ADDRTYPE, NULL, 0}, { csz_AREACODE, NULL, 0}, { csz_CITY, NULL, 0}, { csz_COMPANYNAME, NULL, 0}, { csz_COUNTRYCODE, NULL, 0}, { csz_DIVISIONNAME, NULL, 0}, { csz_EMAILNAME, NULL, 0}, { csz_EXTENSION, NULL, 0}, { csz_FNAME, NULL, 0}, { csz_INFLUENCELEVEL, NULL, 0}, { csz_LANGCODE, NULL, 0}, { csz_LANGNAME, NULL, 0}, { csz_LNAME, NULL, 0}, { csz_MNAME, NULL, 0}, { csz_NOOTHER, NULL, 0}, { csz_PHONE, NULL, 0}, { csz_PID, NULL, 0}, { csz_PRODUCT, NULL, 0}, { csz_REGWIZVER, NULL, 0}, { csz_SOFTWAREROLE, NULL, 0}, { csz_STATE, NULL, 0}, { csz_USERID, NULL, 0}, { csz_ZIP, NULL, 0}, { CSZ_COMPUTERMANF, NULL, 0} }; enum { INDEX_ADDR1 = 0, INDEX_ADDR2, // = 1, INDEX_ADDRTYPE, // = 2, INDEX_AREACODE, // = 3, INDEX_CITY, // = 4, INDEX_COMPANYNAME, // = 5, INDEX_COUNTRYCODE, // = 6, INDEX_DIVISIONNAME, // = 7, INDEX_EMAILNAME, // = 8, INDEX_EXTENSION, // = 9, INDEX_FNAME, // = 10, INDEX_INFLUENCELEVEL, // = 11, INDEX_LANGCODE, // = 12, INDEX_LANGNAME, // = 13, INDEX_LNAME, // = 14, INDEX_MNAME, // = 15, INDEX_NOOTHER, // = 16, INDEX_PHONE, // = 17, INDEX_PID, // = 18, INDEX_PRODUCT, // = 19, INDEX_REGWIZVER, // = 20, INDEX_SOFTWAREROLE, // = 21, INDEX_STATE, // = 22, INDEX_USERID, // = 23, INDEX_ZIP, // = 24, INDEX_COMPUTERMANF // = 25 }; #define REGDATAELEMENTS_LEN sizeof(aryRegDataElements) / sizeof(REGDATAELEMENT) const CUserInfo::RESERVED_IDENTITIES_IDS[] = { IDS_ACCTNAME_ADMINISTRATOR, IDS_ACCTNAME_GUEST }; ///////////////////////////////////////////////////////////// // CUserInfo::CUserInfo CUserInfo::CUserInfo(HINSTANCE hInstance) : m_hInstance(hInstance) { WCHAR szKeyName[] = REG_KEY_OOBE_TEMP; HKEY hKey = NULL; BOOL bName, bOrg; // Init member vars m_cRef = 0; // What if it failed? GetCanonicalizedPath(m_szUserInfoINIFile, USER_INFO_INIFILE); RegOpenKey(HKEY_LOCAL_MACHINE, szKeyName, &hKey); // Initialize or restore registration data ReadUserInfo(hKey, USERINFO_REG_KEY_FIRSTNAME, m_szFirstName, sizeof(m_szFirstName) ); ReadUserInfo(hKey, USERINFO_REG_KEY_MIDDLEINITIAL, m_szMiddleInitial, sizeof(m_szMiddleInitial) ); ReadUserInfo(hKey, USERINFO_REG_KEY_LASTNAME, m_szLastName, sizeof(m_szLastName) ); ReadUserInfo(hKey, USERINFO_REG_KEY_FURIGANANAME, m_szFuriganaName, sizeof(m_szFuriganaName) ); ReadUserInfo(hKey, USERINFO_REG_KEY_COMPANYNAME, m_szCompanyName, sizeof(m_szCompanyName) ); ReadUserInfo(hKey, USERINFO_REG_KEY_ADDRESS1, m_szAddress1, sizeof(m_szAddress1) ); ReadUserInfo(hKey, USERINFO_REG_KEY_ADDRESS2, m_szAddress2, sizeof(m_szAddress2) ); ReadUserInfo(hKey, USERINFO_REG_KEY_CITY, m_szCity, sizeof(m_szCity) ); ReadUserInfo(hKey, USERINFO_REG_KEY_STATE, m_szState, sizeof(m_szState) ); ReadUserInfo(hKey, USERINFO_REG_KEY_ZIP, m_szZip, sizeof(m_szZip) ); ReadUserInfo(hKey, USERINFO_REG_KEY_COUNTRY, m_szCountry, sizeof(m_szCountry) ); ReadUserInfo(hKey, USERINFO_REG_KEY_PRIMARYEMAIL, m_szPrimaryEmail, sizeof(m_szPrimaryEmail) ); ReadUserInfo(hKey, USERINFO_REG_KEY_SECONDARYEMAIL, m_szSecondaryEmail, sizeof(m_szSecondaryEmail) ); ReadUserInfo(hKey, USERINFO_REG_KEY_AREACODE, m_szAreaCode, sizeof(m_szAreaCode) ); ReadUserInfo(hKey, USERINFO_REG_KEY_PHONENUMBER, m_szPhoneNumber, sizeof(m_szPhoneNumber) ); // Initialize or restore new user accounts ReadUserInfo(hKey, USERINFO_REG_KEY_OWNERNAME, m_szOwnerName, sizeof(m_szOwnerName) ); ReadUserInfo(hKey, USERINFO_REG_KEY_DEFAULTNEWUSER ,m_szDefaultNewUser, sizeof(m_szDefaultNewUser) ); m_fUseIdentities = DEFAULT_USEIDENTITIES; m_fMSUpdate = VARIANT_TRUE; m_fMSOffer = VARIANT_TRUE; m_fOtherOffer = VARIANT_TRUE; m_dwCountryID = 0; // Need to distinguish between OEM preset identities and // Registry value, so ReadUserInfo is not used m_fOEMIdentities = FALSE; for (UINT uiIndex = 0; uiIndex < IDENTITIES_MAX; uiIndex++) { wsprintf(m_rgIdentities[uiIndex].rgchRegValue, L"%s%03d", USERINFO_REG_KEY_IDENTITY, uiIndex ); GetPrivateProfileString(USER_INFO_KEYNAME, m_rgIdentities[uiIndex].rgchRegValue, L"\0", m_rgIdentities[uiIndex].rgchIdentity, IDENTITY_CCH_MAX, m_szUserInfoINIFile); TRACE4( L"%s/%s/%s=%s", m_szUserInfoINIFile, USER_INFO_KEYNAME, m_rgIdentities[uiIndex].rgchRegValue, m_rgIdentities[uiIndex].rgchIdentity ); m_fOEMIdentities = m_fOEMIdentities || (m_rgIdentities[uiIndex].rgchIdentity[0] != L'\0'); } if ( (!m_fOEMIdentities) && (hKey != NULL) ) { for (uiIndex = 0; uiIndex < IDENTITIES_MAX; uiIndex++) { DWORD dwType = 0; DWORD dwSize = IDENTITY_CCH_MAX; RegQueryValueEx(hKey, m_rgIdentities[uiIndex].rgchRegValue, 0, &dwType, (LPBYTE)m_rgIdentities[uiIndex].rgchIdentity, &dwSize); } } if ( hKey ) RegCloseKey(hKey); // Get the default name or org if there wasn't one already saved. // bName = FALSE; bOrg = ( *m_szCompanyName == L'\0' ); // This is so OEMs can prepopulate the user or org field. We just store the name // in the first name field. We might want to split it up into First, MI, and Last // in the future? // if ( bName || bOrg ) { SetupGetSetupInfo( bName ? m_szFirstName : NULL, bName ? sizeof(m_szFirstName) : 0, m_szCompanyName ? m_szCompanyName : NULL, m_szCompanyName ? sizeof(m_szCompanyName) : 0, NULL, 0, NULL ); } m_RegDataElements = aryRegDataElements; m_RegDataElements[0].lpQueryElementValue = (LPWSTR) m_szAddress1; m_RegDataElements[1].lpQueryElementValue = (LPWSTR) m_szAddress2; m_RegDataElements[3].lpQueryElementValue = (LPWSTR) m_szAreaCode; m_RegDataElements[4].lpQueryElementValue = (LPWSTR) m_szCity; m_RegDataElements[5].lpQueryElementValue = (LPWSTR) m_szCompanyName; m_RegDataElements[8].lpQueryElementValue = (LPWSTR) m_szPrimaryEmail; m_RegDataElements[10].lpQueryElementValue = (LPWSTR) m_szFirstName; m_RegDataElements[15].lpQueryElementValue = (LPWSTR) m_szMiddleInitial; m_RegDataElements[14].lpQueryElementValue = (LPWSTR) m_szLastName; m_RegDataElements[17].lpQueryElementValue = (LPWSTR) m_szPhoneNumber; m_RegDataElements[22].lpQueryElementValue = (LPWSTR) m_szState; m_RegDataElements[24].lpQueryElementValue = (LPWSTR) m_szZip; for (int i = 0; i < RESERVED_IDENTITIES_MAX; i++) { if (!LoadString( m_hInstance, RESERVED_IDENTITIES_IDS[i], m_szReservedIdentities[i], sizeof(m_szReservedIdentities[i]) / sizeof(TCHAR) )) { m_szReservedIdentities[i][0] = L'\0'; } } } ///////////////////////////////////////////////////////////// // CUserInfo::~CUserInfo CUserInfo::~CUserInfo() { assert(m_cRef == 0); } void CUserInfo::ReadUserInfo(HKEY hKey, WCHAR* pszKey, WCHAR* pszValue, DWORD dwSize) { DWORD dwType = 0; DWORD cSize = dwSize; *pszValue = L'\0'; if( ( hKey == NULL) || ( ERROR_SUCCESS != RegQueryValueEx(hKey, pszKey, 0, &dwType, (LPBYTE)pszValue, &dwSize) || *pszValue == L'\0' ) ) { GetPrivateProfileString(USER_INFO_KEYNAME, pszKey, L"\0", pszValue, cSize, m_szUserInfoINIFile); } } void CUserInfo::WriteUserInfo(WCHAR* pszBuf, WCHAR* pszKey, WCHAR* pszValue) { WCHAR szKeyName[] = REG_KEY_OOBE_TEMP; HKEY hKey; // A null value must be converted to an empty string. // if ( pszValue ) lstrcpy(pszBuf, pszValue); else *pszBuf = L'\0'; // Commit the data to the registry. // if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) == ERROR_SUCCESS ) { if ( *pszBuf ) RegSetValueEx(hKey, pszKey, 0, REG_SZ, (LPBYTE) pszValue, BYTES_REQUIRED_BY_SZ(pszValue)); else RegDeleteValue(hKey, pszKey); RegFlushKey(hKey); RegCloseKey(hKey); } } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Identity //// HRESULT CUserInfo::get_Identity(UINT uiIndex, BSTR* pbstrVal) { if (uiIndex >= IDENTITIES_MAX) { return E_INVALIDARG; } *pbstrVal = SysAllocString(m_rgIdentities[uiIndex].rgchIdentity); if (NULL == *pbstrVal) { return E_OUTOFMEMORY; } return S_OK; } HRESULT CUserInfo::set_Identity(UINT uiIndex, WCHAR* pszVal) { if (uiIndex < IDENTITIES_MAX) { if (!pszVal) // delete the account if it exists { WriteUserInfo(m_rgIdentities[uiIndex].rgchIdentity, m_rgIdentities[uiIndex].rgchRegValue, NULL); } else { if (lstrlen(pszVal) <= IDENTITY_CCH_MAX) { WriteUserInfo(m_rgIdentities[uiIndex].rgchIdentity, m_rgIdentities[uiIndex].rgchRegValue, pszVal ); } } } return S_OK; } HRESULT CUserInfo::get_Identities(PSTRINGLIST* pUserList) { for (UINT uiIndex = 0; uiIndex < IDENTITIES_MAX; uiIndex++) { if (lstrlen(m_rgIdentities[uiIndex].rgchIdentity) > 0) { PSTRINGLIST Cell; Cell = CreateStringCell(m_rgIdentities[uiIndex].rgchIdentity); if (Cell) { FixString(Cell->String); InsertList(pUserList, Cell); } } } return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: UseIdentities //// HRESULT CUserInfo::get_UseIdentities(VARIANT_BOOL *pfVal) { *pfVal = m_fUseIdentities; return S_OK; } HRESULT CUserInfo::set_UseIdentities(VARIANT_BOOL fVal) { m_fUseIdentities = fVal; return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: MSUpdate //// HRESULT CUserInfo::get_MSUpdate(VARIANT_BOOL *pfVal) { *pfVal = m_fMSUpdate; return S_OK; } HRESULT CUserInfo::set_MSUpdate(VARIANT_BOOL fVal) { m_fMSUpdate = fVal; return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: MSOffer //// HRESULT CUserInfo::get_MSOffer(VARIANT_BOOL *pfVal) { *pfVal = m_fMSOffer; return S_OK; } HRESULT CUserInfo::set_MSOffer(VARIANT_BOOL fVal) { m_fMSOffer = fVal; return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: OtherOffer //// HRESULT CUserInfo::get_OtherOffer(VARIANT_BOOL *pfVal) { *pfVal = m_fOtherOffer; return S_OK; } HRESULT CUserInfo::set_OtherOffer(VARIANT_BOOL fVal) { m_fOtherOffer = fVal; return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: CountryID //// HRESULT CUserInfo::get_CountryID(DWORD *pdwVal) { *pdwVal = m_dwCountryID; return S_OK; } HRESULT CUserInfo::set_CountryID(DWORD dwVal) { m_dwCountryID = dwVal; return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// CHECK :: Identity //// // constant strings used for name validation #define DOT_CHAR '.' #define DOT_AND_SPACE_STR TEXT(". ") #define CTRL_CHARS_0 TEXT( "\001\002\003\004\005\006\007") #define CTRL_CHARS_1 TEXT("\010\011\012\013\014\015\016\017") #define CTRL_CHARS_2 TEXT("\020\021\022\023\024\025\026\027") #define CTRL_CHARS_3 TEXT("\030\031\032\033\034\035\036\037") #define CTRL_CHARS_STR CTRL_CHARS_0 CTRL_CHARS_1 CTRL_CHARS_2 CTRL_CHARS_3 #define ILLEGAL_FAT_CHARS CTRL_CHARS_STR TEXT("\"*+,/:;<=>?[\\]|@") HRESULT CUserInfo::check_Identity(UINT uiIndex, VARIANT_BOOL* pfValid) { BSTR bstrVal; *pfValid = TRUE; // initalize outparam, assume ok if (SUCCEEDED(get_Identity(uiIndex, &bstrVal))) { // check length DWORD cchVal = lstrlen(bstrVal); if (cchVal > 0) // if cchVal == 0, user trying to delete or didn't define { check_Identity(bstrVal, pfValid); for (UINT i = 0; i < uiIndex; i++) // check not equal to other names { BSTR bstrValOther; if (SUCCEEDED(get_Identity(i, &bstrValOther))) { if (0 == StrCmpI(bstrVal, bstrValOther)) { *pfValid = FALSE; } SysFreeString(bstrValOther); } } } SysFreeString(bstrVal); } return S_OK; } HRESULT CUserInfo::check_Identity(WCHAR* pszVal, VARIANT_BOOL* pfValid) { *pfValid = TRUE; // initalize outparam, assume ok if (pszVal) { WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD cchComputerName = sizeof(szComputerName) / sizeof(WCHAR); DWORD cchVal = lstrlen(pszVal); if (cchVal > 0) // if cchVal == 0, user trying to delete or didn't define { if (cchVal > 20) { *pfValid = FALSE; } // check for trailing periods if (pszVal[cchVal - 1] == DOT_CHAR) { *pfValid = FALSE; } // check not all spaces and periods if (StrSpn(pszVal, DOT_AND_SPACE_STR) == (int)cchVal) { *pfValid = FALSE; } // check nothing from ILLEGAL_FAT_CHARS in name if (StrCSpn(pszVal, ILLEGAL_FAT_CHARS) < (int)cchVal) { *pfValid = FALSE; } for (int i = 0; i < RESERVED_IDENTITIES_MAX; i++) { if (!lstrcmpi(m_szReservedIdentities[i], pszVal)) { *pfValid = FALSE; break; } } if (GetComputerName(szComputerName, &cchComputerName)) { if (!lstrcmpi(szComputerName, pszVal)) { *pfValid = FALSE; } } } else { *pfValid = FALSE; } } else { *pfValid = FALSE; } return S_OK; } STDMETHODIMP CUserInfo::SuggestIdentity0() { if (lstrlen(m_rgIdentities[0].rgchIdentity) == 0) { LPWSTR Candidates[] = {m_szOwnerName, m_szFirstName, m_szLastName, NULL}; for (int i = 0; Candidates[i]; i++) { if (lstrlen(Candidates[i]) > 0) { VARIANT_BOOL b; check_Identity(Candidates[i], &b); if (b) { FixString(Candidates[i]); set_Identity(0, Candidates[i]); break; } } } } return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: FirstName //// HRESULT CUserInfo::set_FirstName(WCHAR* pszVal) { WriteUserInfo(m_szFirstName, USERINFO_REG_KEY_FIRSTNAME, pszVal); return S_OK; } HRESULT CUserInfo::get_FirstName(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szFirstName); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: MiddleInitial //// HRESULT CUserInfo::set_MiddleInitial(WCHAR* pszVal) { WriteUserInfo(m_szMiddleInitial, USERINFO_REG_KEY_MIDDLEINITIAL, pszVal); return S_OK; } HRESULT CUserInfo::get_MiddleInitial(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szMiddleInitial); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: LastName //// HRESULT CUserInfo::set_LastName(WCHAR* pszVal) { WriteUserInfo(m_szLastName, USERINFO_REG_KEY_LASTNAME, pszVal); return S_OK; } HRESULT CUserInfo::get_LastName(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szLastName); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: FuriganaName //// HRESULT CUserInfo::set_FuriganaName(WCHAR* pszVal) { WriteUserInfo(m_szFuriganaName, USERINFO_REG_KEY_FURIGANANAME, pszVal); return S_OK; } HRESULT CUserInfo::get_FuriganaName(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szFuriganaName); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: CompanyName //// HRESULT CUserInfo::set_CompanyName(WCHAR* pszVal) { WriteUserInfo(m_szCompanyName, USERINFO_REG_KEY_COMPANYNAME, pszVal); return S_OK; } HRESULT CUserInfo::get_CompanyName(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szCompanyName); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Address1 //// HRESULT CUserInfo::set_Address1(WCHAR* pszVal) { WriteUserInfo(m_szAddress1, USERINFO_REG_KEY_ADDRESS1, pszVal); return S_OK; } HRESULT CUserInfo::get_Address1(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szAddress1); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Address2 //// HRESULT CUserInfo::set_Address2(WCHAR* pszVal) { WriteUserInfo(m_szAddress2, USERINFO_REG_KEY_ADDRESS2, pszVal); return S_OK; } HRESULT CUserInfo::get_Address2(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szAddress2); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: City //// HRESULT CUserInfo::set_City(WCHAR* pszVal) { WriteUserInfo(m_szCity, USERINFO_REG_KEY_CITY, pszVal); return S_OK; } HRESULT CUserInfo::get_City(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szCity); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: State //// HRESULT CUserInfo::set_State(WCHAR* pszVal) { WriteUserInfo(m_szState, USERINFO_REG_KEY_STATE, pszVal); return S_OK; } HRESULT CUserInfo::get_State(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szState); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Zip //// HRESULT CUserInfo::set_Zip(WCHAR* pszVal) { WriteUserInfo(m_szZip, USERINFO_REG_KEY_ZIP, pszVal); return S_OK; } HRESULT CUserInfo::get_Zip(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szZip); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Country //// HRESULT CUserInfo::set_Country(WCHAR* pszVal) { WriteUserInfo(m_szCountry, USERINFO_REG_KEY_COUNTRY, pszVal); return S_OK; } HRESULT CUserInfo::get_Country(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szCountry); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: PrimaryEmail //// HRESULT CUserInfo::set_PrimaryEmail(WCHAR* pszVal) { WriteUserInfo(m_szPrimaryEmail, USERINFO_REG_KEY_PRIMARYEMAIL, pszVal); return S_OK; } HRESULT CUserInfo::get_PrimaryEmail(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szPrimaryEmail); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: SecondaryEmail //// HRESULT CUserInfo::set_SecondaryEmail(WCHAR* pszVal) { WriteUserInfo(m_szSecondaryEmail, USERINFO_REG_KEY_SECONDARYEMAIL, pszVal); return S_OK; } HRESULT CUserInfo::get_SecondaryEmail(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szSecondaryEmail); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: AreaCode //// HRESULT CUserInfo::set_AreaCode(WCHAR* pszVal) { WriteUserInfo(m_szAreaCode, USERINFO_REG_KEY_AREACODE, pszVal); return S_OK; } HRESULT CUserInfo::get_AreaCode(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szAreaCode); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: Number //// HRESULT CUserInfo::set_PhoneNumber(WCHAR* pszVal) { WriteUserInfo(m_szPhoneNumber, USERINFO_REG_KEY_PHONENUMBER, pszVal); return S_OK; } HRESULT CUserInfo::get_PhoneNumber(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szPhoneNumber); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: OwnerName //// HRESULT CUserInfo::set_OwnerName(WCHAR* pszVal) { WriteUserInfo(m_szOwnerName, USERINFO_REG_KEY_OWNERNAME, pszVal); return S_OK; } HRESULT CUserInfo::get_OwnerName(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szOwnerName); return S_OK; } //////////////////////////////////////////////// //////////////////////////////////////////////// //// GET / SET :: DefaultNewUser //// HRESULT CUserInfo::set_DefaultNewUser(WCHAR* pszVal) { WriteUserInfo(m_szDefaultNewUser, USERINFO_REG_KEY_DEFAULTNEWUSER, pszVal); return S_OK; } HRESULT CUserInfo::get_DefaultNewUser(BSTR* pbstrVal) { *pbstrVal = SysAllocString(m_szDefaultNewUser); return S_OK; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IUnknown implementation /////// /////// ///////////////////////////////////////////////////////////// // CObMain::QueryInterface STDMETHODIMP CUserInfo::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); } ///////////////////////////////////////////////////////////// // CUserInfo::AddRef STDMETHODIMP_(ULONG) CUserInfo::AddRef() { return ++m_cRef; } ///////////////////////////////////////////////////////////// // CUserInfo::Release STDMETHODIMP_(ULONG) CUserInfo::Release() { return --m_cRef; } ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// /////// IDispatch implementation /////// /////// ///////////////////////////////////////////////////////////// // CUserInfo::GetTypeInfo STDMETHODIMP CUserInfo::GetTypeInfo(UINT, LCID, ITypeInfo**) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CUserInfo::GetTypeInfoCount STDMETHODIMP CUserInfo::GetTypeInfoCount(UINT* pcInfo) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////// // CUserInfo::GetIDsOfNames STDMETHODIMP CUserInfo::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(UserInfoExternalInterface)/sizeof(DISPATCHLIST); iX ++) { if(lstrcmp(UserInfoExternalInterface[iX].szName, rgszNames[0]) == 0) { rgDispId[0] = UserInfoExternalInterface[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; } ///////////////////////////////////////////////////////////// // CUserInfo::Invoke HRESULT CUserInfo::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_USERINFO_CHECK_IDENTITY: { TRACE(L"DISPID_USERINFO_CHECK_IDENTITY\n"); if(pdispparams && &pdispparams[0].rgvarg[0] && pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; if (pdispparams[0].rgvarg[0].vt == VT_BSTR) { check_Identity(pdispparams[0].rgvarg[0].bstrVal, &pvarResult->boolVal); } else { check_Identity(pdispparams[0].rgvarg[0].uintVal, &pvarResult->boolVal); } } break; } case DISPID_USERINFO_GET_FIRSTNAME: { TRACE(L"DISPID_USERINFO_GET_FIRSTNAME\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_FirstName(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_FIRSTNAME: { TRACE(L"DISPID_USERINFO_SET_FIRSTNAME\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_FirstName(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_MIDDLEINITIAL: { TRACE(L"DISPID_USERINFO_GET_MIDDLEINITIAL\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_MiddleInitial(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_MIDDLEINITIAL: { TRACE(L"DISPID_USERINFO_SET_MIDDLEINITIAL\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_MiddleInitial(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_LASTNAME: { TRACE(L"DISPID_USERINFO_GET_LASTNAME\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_LastName(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_LASTNAME: { TRACE(L"DISPID_USERINFO_SET_LASTNAME\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_LastName(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_FURIGANANAME: { TRACE(L"DISPID_USERINFO_GET_FURIGANANAME\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_FuriganaName(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_FURIGANANAME: { TRACE(L"DISPID_USERINFO_SET_FURIGANANAME\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_FuriganaName(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_OWNERNAME: { TRACE(L"DISPID_USERINFO_GET_OWNERNAME\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_OwnerName(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_OWNERNAME: { TRACE(L"DISPID_USERINFO_SET_OWNERNAME\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_OwnerName(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_COMPANYNAME: { TRACE(L"DISPID_USERINFO_GET_COMPANYNAME\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_CompanyName(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_COMPANYNAME: { TRACE(L"DISPID_USERINFO_SET_COMPANYNAME\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_CompanyName(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_ADDRESS1: { TRACE(L"DISPID_USERINFO_GET_ADDRESS1\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_Address1(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_ADDRESS1: { TRACE(L"DISPID_USERINFO_SET_ADDRESS1\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_Address1(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_ADDRESS2: { TRACE(L"DISPID_USERINFO_GET_ADDRESS2\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_Address2(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_ADDRESS2: { TRACE(L"DISPID_USERINFO_SET_ADDRESS2\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_Address2(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_CITY: { TRACE(L"DISPID_USERINFO_GET_CITY\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_City(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_CITY: { TRACE(L"DISPID_USERINFO_SET_CITY\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_City(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_STATE: { TRACE(L"DISPID_USERINFO_GET_STATE\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_State(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_STATE: { TRACE(L"DISPID_USERINFO_SET_STATE\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_State(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_ZIP: { TRACE(L"DISPID_USERINFO_GET_ZIP\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_Zip(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_ZIP: { TRACE(L"DISPID_USERINFO_SET_ZIP\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_Zip(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_COUNTRY: { TRACE(L"DISPID_USERINFO_GET_COUNTRY\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_Country(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_COUNTRY: { TRACE(L"DISPID_USERINFO_SET_COUNTRY\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_Country(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_PRIMARYEMAIL: { TRACE(L"DISPID_USERINFO_GET_PRIMARYEMAIL\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_PrimaryEmail(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_PRIMARYEMAIL: { TRACE(L"DISPID_USERINFO_SET_PRIMARYEMAIL\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_PrimaryEmail(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_SECONDARYEMAIL: { TRACE(L"DISPID_USERINFO_GET_SECONDARYEMAIL\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_SecondaryEmail(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_SECONDARYEMAIL: { TRACE(L"DISPID_USERINFO_SET_SECONDARYEMAIL\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_SecondaryEmail(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_AREACODE: { TRACE(L"DISPID_USERINFO_GET_AREACODE\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_AreaCode(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_AREACODE: { TRACE(L"DISPID_USERINFO_SET_AREACODE\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_AreaCode(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_PHONENUMBER: { TRACE(L"DISPID_USERINFO_GET_PHONENUMBER\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_PhoneNumber(&pvarResult->bstrVal); } break; } case DISPID_USERINFO_SET_PHONENUMBER: { TRACE(L"DISPID_USERINFO_SET_PHONENUMBER\n"); if(pdispparams && &pdispparams[0].rgvarg[0]) set_PhoneNumber(pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_MSUPDATE: { TRACE(L"DISPID_USERINFO_GET_MSUPDATE"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; get_MSUpdate(&(pvarResult->boolVal)); } break; } case DISPID_USERINFO_SET_MSUPDATE: { TRACE(L"DISPID_USERINFO_SET_MSUPDATE"); if (pdispparams && 0 < pdispparams->cArgs) set_MSUpdate(pdispparams[0].rgvarg[0].boolVal); break; } case DISPID_USERINFO_GET_MSOFFER: { TRACE(L"DISPID_USERINFO_GET_MSOFFER"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; get_MSOffer(&(pvarResult->boolVal)); } break; } case DISPID_USERINFO_SET_MSOFFER: { TRACE(L"DISPID_USERINFO_SET_MSOFFER"); if (pdispparams && 0 < pdispparams->cArgs) set_MSOffer(pdispparams[0].rgvarg[0].boolVal); break; } case DISPID_USERINFO_GET_OTHEROFFER: { TRACE(L"DISPID_USERINFO_GET_OTHEROFFER"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; get_OtherOffer(&(pvarResult->boolVal)); } break; } case DISPID_USERINFO_SET_OTHEROFFER: { TRACE(L"DISPID_USERINFO_SET_OTHEROFFER"); if (pdispparams && 0 < pdispparams->cArgs) set_OtherOffer(pdispparams[0].rgvarg[0].boolVal); break; } case DISPID_USERINFO_GET_COUNTRYID: { TRACE(L"DISPID_USERINFO_GET_COUNTRYID"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_I4; get_CountryID((PDWORD)&(pvarResult->lVal)); } break; } case DISPID_USERINFO_SET_COUNTRYID: { TRACE(L"DISPID_USERINFO_SET_COUNTRYID"); if (pdispparams && 0 < pdispparams->cArgs) set_CountryID(pdispparams[0].rgvarg[0].lVal); break; } case DISPID_USERINFO_GET_IDENTITIESMAX: { TRACE(L"DISPID_USERINFO_GET_IDENTITIESMAX\n"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_I2; get_IdentitiesMax(&pvarResult->iVal); } break; } case DISPID_USERINFO_GET_IDENTITY: { TRACE(L"DISPID_USERINFO_GET_IDENTITY\n"); if ( NULL != pdispparams && 0 < pdispparams->cArgs && NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_Identity(pdispparams[0].rgvarg[0].uintVal, &pvarResult->bstrVal ); } break; } case DISPID_USERINFO_SET_IDENTITY: { TRACE(L"DISPID_USERINFO_SET_IDENTITY\n"); if(pdispparams && 1 < pdispparams->cArgs) set_Identity(pdispparams[0].rgvarg[1].uintVal, pdispparams[0].rgvarg[0].bstrVal); break; } case DISPID_USERINFO_GET_USEIDENTITIES: { TRACE(L"DISPID_USERINFO_GET_USEIDENTITIES"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; get_UseIdentities(&(pvarResult->boolVal)); } break; } case DISPID_USERINFO_SET_USEIDENTITIES: { TRACE(L"DISPID_USERINFO_SET_USEIDENTITIES"); if (pdispparams && 0 < pdispparams->cArgs) set_UseIdentities(pdispparams[0].rgvarg[0].boolVal); break; } case DISPID_USERINFO_GET_OEMIDENTITIES: { TRACE(L"DISPID_USERINFO_GET_OEMIDENTITIES"); if (NULL != pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BOOL; get_OEMIdentities(&(pvarResult->boolVal)); } break; } case DISPID_USERINFO_SUGGESTIDENTITY0: { OutputDebugString(L"DISPID_USERINFO_SUGGESTIDENTITY0\n"); SuggestIdentity0(); break; } case DISPID_USERINFO_GET_DEFAULTNEWUSER: { TRACE(L"DISPID_USERINFO_GET_DEFAULTNEWUSER"); if(pvarResult) { VariantInit(pvarResult); V_VT(pvarResult) = VT_BSTR; get_DefaultNewUser(&pvarResult->bstrVal); } break; } default: { hr = DISP_E_MEMBERNOTFOUND; break; } } return hr; } // HRESULT CUserInfo::set_CountryCode(DWORD dwCountryCd) { m_dwCountryCode = dwCountryCd; return S_OK; } // This funtion will form the query string to be sent to the ISP signup server // HRESULT CUserInfo::GetQueryString ( BSTR bstrBaseURL, BSTR *lpReturnURL ) { LPWSTR lpWorkingURL; WORD cchBuffer = 0; LPREGDATAELEMENT lpElement; LPWSTR lpszBaseURL = bstrBaseURL; int i; BSTR pbstrVal = NULL; CProductID PidObj; PidObj.get_PID(&pbstrVal); m_RegDataElements[INDEX_PID].lpQueryElementValue = (LPWSTR) pbstrVal; WCHAR buffer[8]; _itow( m_dwCountryCode, buffer, 8 ); m_RegDataElements[INDEX_COUNTRYCODE].lpQueryElementValue = (LPWSTR)buffer; m_RegDataElements[INDEX_PRODUCT].lpQueryElementValue = REG_VAL_OOBE; // Now read the INI file. WCHAR szOemInfoFile[MAX_PATH] = L"\0"; WCHAR szComputerManf[MAX_PATH] = L"\0"; GetSystemDirectory(szOemInfoFile, MAX_CHARS_IN_BUFFER(szOemInfoFile)); lstrcat(szOemInfoFile, OEMINFO_INI_FILENAME); GetPrivateProfileString(USER_COMP_MANF_SEC, USER_COMP_MANF_KEY, L"\0", szComputerManf, MAX_CHARS_IN_BUFFER(szComputerManf), szOemInfoFile); m_RegDataElements[INDEX_COMPUTERMANF].lpQueryElementValue = szComputerManf; //ASSERT(lpReturnURL); if (!lpReturnURL) return E_FAIL; // Calculate how big of a buffer we will need cchBuffer += (WORD)lstrlen(lpszBaseURL) + 1; for (i = 0; i < REGDATAELEMENTS_LEN; i ++) { lpElement = &m_RegDataElements[i]; //ASSERT(lpElement); if (lpElement->lpQueryElementName) { cchBuffer += (WORD)( lstrlen(lpElement->lpQueryElementName) + (lstrlen(lpElement->lpQueryElementValue) * 3) // *3 for encoding + 3 // For the = and & and the terminator // (because we copy lpQueryElementValue // into a new buffer for encoding) ); } else { // extra character is for the trailing & cchBuffer += (WORD)(lstrlen(lpElement->lpQueryElementValue) + 1); } } cchBuffer++; // Terminator // Allocate a buffer large enough if (NULL == (lpWorkingURL = (LPWSTR)GlobalAllocPtr(GPTR, BYTES_REQUIRED_BY_CCH(cchBuffer)))) return E_FAIL; lstrcpy(lpWorkingURL, lpszBaseURL); // See if this ISP provided URL is already a Query String. if (*lpWorkingURL) { if (NULL != wcschr(lpWorkingURL, L'?')) lstrcat(lpWorkingURL, cszAmpersand); // Append our params else lstrcat(lpWorkingURL, cszQuestion); // Start with our params } for (i = 0; i < REGDATAELEMENTS_LEN; i ++) { lpElement = &m_RegDataElements[i]; //ASSERT(lpElement); if (lpElement->lpQueryElementName) { // If there is a query value, then encode it if (lpElement->lpQueryElementValue) { // Allocate a buffer to encode into size_t cch = (lstrlen(lpElement->lpQueryElementValue) + 1) * 3; LPWSTR lpszVal = (LPWSTR) malloc(BYTES_REQUIRED_BY_CCH(cch)); lstrcpy(lpszVal, lpElement->lpQueryElementValue); URLEncode(lpszVal, cch); URLAppendQueryPair(lpWorkingURL, (LPWSTR)lpElement->lpQueryElementName, lpszVal); free(lpszVal); } else { URLAppendQueryPair(lpWorkingURL, (LPWSTR)lpElement->lpQueryElementName, NULL); } } else { if (lpElement->lpQueryElementValue) { lstrcat(lpWorkingURL, lpElement->lpQueryElementValue); lstrcat(lpWorkingURL, cszAmpersand); } } } // Terminate the working URL properly, by removing the trailing ampersand lpWorkingURL[lstrlen(lpWorkingURL)-1] = L'\0'; // Set the return VALUE. We must allocate here, since the caller will free // this returned string, and A2W only puts the string in the stack *lpReturnURL = SysAllocString(lpWorkingURL); // Free the buffer GlobalFreePtr(lpWorkingURL); return (S_OK); } void CUserInfo::FixString(BSTR bstrVal) { if (bstrVal != NULL) { // StrTrim removes both leading and trailing spaces StrTrim(bstrVal, TEXT(" ")); } }