Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

477 lines
11 KiB

/*
Copyright (c) 2000 Microsoft Corporation
Module Name:
setting.cpp
Abstract:
CSetting object. Used to support Remote Assistance Channel settings.
Revision History:
created steveshi 08/23/00
*/
#include "stdafx.h"
#include "SAFRCFileDlg.h"
#include "setting.h"
#include "userenv.h"
#include "stdio.h"
const TCHAR cstrRCBDYINI[] = _T("RcBuddy.ini");
const TCHAR cstrRCBDYAPP[] = _T("RcBuddyChannel");
const TCHAR cstrSubDir[] = _T("\\Local Settings\\Application Data\\RcIncidents");
extern HINSTANCE g_hInstance;
BOOL CreateRAIncidentDirectory(LPTSTR path, LPCTSTR subPath);
/*********************************************************
Func:
GetProfileString
Abstract:
Get profile string inside the channel's setting file.
Params:
bstrSec: Section key.
pVal: Output string (default is "0", if not found.)
*********************************************************/
HRESULT CSetting::GetProfileString(BSTR bstrSec, BSTR* pVal)
{
HRESULT hr = S_FALSE;
TCHAR sBuf[512];
DWORD dwSize;
USES_CONVERSION;
if (FAILED(InitProfile()))
goto done;
dwSize = GetPrivateProfileString(cstrRCBDYAPP,
W2T(bstrSec),
TEXT("0"), &sBuf[0], 512, m_pIniFile);
*pVal = CComBSTR(sBuf).Copy();
hr = S_OK;
done:
return hr;
}
/*********************************************************
Func:
SetProfileString
Abstract:
Set profile string inside the channel's setting file.
Params:
bstrSec: Section key.
bstrVal: New value
*********************************************************/
HRESULT CSetting::SetProfileString(BSTR bstrSec, BSTR bstrVal)
{
HRESULT hr = S_FALSE;
USES_CONVERSION;
if (FAILED(InitProfile()))
goto done;
//MessageBox(NULL,m_pIniFile,OLE2T(bstrSec),MB_OK);
if (!WritePrivateProfileString(cstrRCBDYAPP, W2T(bstrSec), W2T(bstrVal), m_pIniFile))
goto done;
hr = S_OK;
done:
return hr;
}
/*********************************************************
Func:
get_GetUserProfileDirectory
Abstract:
Return user's profile directory
*********************************************************/
HRESULT CSetting::get_GetUserProfileDirectory(/*[out, retval]*/ BSTR *pVal)
{
HRESULT hr = S_FALSE;
if (FAILED(hr = InitProfile()))
goto done;
*pVal = CComBSTR(m_pProfileDir).Detach();
done:
return hr;
}
/*********************************************************
Func:
get_GetUserTempFileName
Abstract:
Return a temp file name under user's profile directory
*********************************************************/
HRESULT CSetting::get_GetUserTempFileName(/*[out, retval]*/ BSTR *pVal)
{
HRESULT hr = S_FALSE;
TCHAR sFile[MAX_PATH + 256];
if(FAILED(InitProfile()))
goto done;
// Get Temp file name
if (!GetTempFileName(m_pProfileDir, _T("RC"), 0, &sFile[0]))
goto done;
*pVal = CComBSTR(sFile).Copy();
hr = S_OK;
done:
return hr;
}
//////////////////////////////////////////////////////////////////////////////////////
// Helper functions used to support the above methods or properties
/////////////////////////////
/*********************************************************
Func:
InitProfile
Abstract:
Create the setting file.
A RCIncidents subdir will be created under user's profile dir.
A RcBuddy.ini file be created as the user's RA channel setting file.
*********************************************************/
HRESULT CSetting::InitProfile()
{
HRESULT hr = E_FAIL;
if (m_pProfileDir && m_pIniFile) // No need to process
return S_OK;
if (m_pProfileDir || m_pIniFile) // Only one has value: Error. No need to process either.
return E_FAIL;
// Get User profile directory
HANDLE hProcess = GetCurrentProcess();
TCHAR* pPath = NULL;
TCHAR sPath[MAX_PATH];
ULONG ulSize = sizeof(sPath) - sizeof(cstrSubDir) -1; // preserve space for subdir.
TCHAR sFile[MAX_PATH + 256];
HANDLE hToken = NULL;
int iRet = 0;
BOOL bNeedFree = FALSE;
DWORD dwSizePtr=0;
if (!OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_WRITE, &hToken))
goto done;
if (!GetUserProfileDirectory(hToken, &sPath[0], &ulSize)) // Buffer not big enough
{
if (ulSize == sizeof(sPath)-1) // Not because of insufficent space.
goto done;
//SWI
dwSizePtr=ulSize+1+sizeof(cstrSubDir);
pPath = (TCHAR*)malloc((dwSizePtr)*sizeof(TCHAR));
if (!pPath)
{
hr = E_OUTOFMEMORY;
goto done;
}
bNeedFree = TRUE;
if (!GetUserProfileDirectory(hToken, pPath, &ulSize))
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto done;
}
}
if (!pPath)
{
dwSizePtr=MAX_PATH;
pPath = sPath;
}
// Create RCIncidents sub dir
// _tcscat(pPath, sSubDir);
// iRet = SHCreateDirectoryEx(NULL, pPath, NULL);
BOOL retVal= CreateRAIncidentDirectory(pPath, cstrSubDir);
if (retVal == FALSE)
goto done;
//SWI
//_tcscat(pPath, cstrSubDir);
hr=StringCchCat(pPath,dwSizePtr,cstrSubDir);
if(FAILED(hr))
{
goto done;
}
// if (iRet != ERROR_SUCCESS && iRet != ERROR_ALREADY_EXISTS)
// goto done;
// Set variables
iRet = (_tcslen(pPath) + 1) * sizeof(TCHAR);
m_pProfileDir = (TCHAR*)malloc(iRet);
if (!m_pProfileDir)
{
hr = E_OUTOFMEMORY;
goto done;
}
memcpy(m_pProfileDir, pPath, iRet);
dwSizePtr= iRet + (1+sizeof(cstrRCBDYINI))*sizeof(TCHAR);
m_pIniFile = (TCHAR*)malloc(dwSizePtr);
if (!m_pIniFile)
{
hr = E_OUTOFMEMORY;
goto done;
}
//SWI
//_stprintf(m_pIniFile, _T("%s\\%s"), m_pProfileDir, cstrRCBDYINI);
hr=StringCbPrintf(m_pIniFile,dwSizePtr,_T("%s\\%s"), m_pProfileDir, cstrRCBDYINI);
done:
if (hToken)
CloseHandle(hToken);
if (bNeedFree)
free(pPath);
return hr;
}
/*********************************************************
Func:
get_GetPropertyInBlob
Abstract:
Get the specified property value in Blob
Params:
bstrBlob: Blob for searching. (ex: 8;PASS=ABC )
bstrName: property name. (ex: "PASS", without '=' char)
*********************************************************/
HRESULT CSetting::get_GetPropertyInBlob(/*[in]*/ BSTR bstrBlob, /*[in]*/ BSTR bstrName, /*[out, retval]*/ BSTR *pVal)
{
HRESULT hRet = S_FALSE;
WCHAR *p1, *p2, *pEnd;
LONG lTotal =0;
size_t lProp = 0;
size_t iNameLen;
if (!bstrBlob || *bstrBlob==L'\0' || !bstrName || *bstrName ==L'\0'|| !pVal)
return FALSE;
iNameLen = wcslen(bstrName);
pEnd = bstrBlob + wcslen(bstrBlob);
p1 = p2 = bstrBlob;
while (1)
{
// get porperty length
while (*p2 != L';' && *p2 != L'\0' && iswdigit(*p2) ) p2++;
if (*p2 != L';')
goto done;
*p2 = L'\0'; // set it to get length
lProp = _wtol(p1);
*p2 = L';'; // revert it back.
// get property string
p1 = ++p2;
while (*p2 != L'=' && *p2 != L'\0' && p2 < p1+lProp) p2++;
if (*p2 != L'=')
goto done;
if ((p2-p1==iNameLen) && (wcsncmp(p1, bstrName, iNameLen)==0) )
{
if (lProp == iNameLen+1) // A=B= case (no value)
goto done;
WCHAR C = *(p2 + lProp-iNameLen);
*(p2 + lProp-iNameLen) = L'\0';
*pVal = SysAllocString(p2+1);
*(p2 + lProp-iNameLen) = C;
hRet = S_OK;
break;
}
// check next property
p2 = p1 = p1 + lProp;
if (p2 > pEnd)
break;
}
done:
return hRet;
}
STDMETHODIMP CSetting::AddPropertyToBlob(BSTR pName, BSTR pValue, BSTR poldBlob, BSTR *pnewBlob)
{
WCHAR *pszBuf = NULL;
LONG len, lOldBlob = 0;
BOOL bHasValue = FALSE;
DWORD dwSizePtr=0;
if(!pName || *pName==L'\0' || !pnewBlob)
{
goto done;
}
if(poldBlob && *poldBlob != L'\0')
lOldBlob = wcslen(poldBlob);
len = wcslen(pName) + 1; // ;pName=pValue 1 is for the '='
if (pValue && *pValue != L'\0')
{
len += wcslen(pValue);
bHasValue = TRUE;
}
//SWI
dwSizePtr=len + lOldBlob + 1;
pszBuf = new WCHAR[dwSizePtr];
if (lOldBlob > 0)
{
if (bHasValue)
{
//SWI
//swprintf(pszBuf, L"%s%d;%s=%s", poldBlob, len, pName, pValue);
StringCchPrintfW(pszBuf,dwSizePtr,L"%s%d;%s=%s", poldBlob, len, pName, pValue);
}
else
{
//SWI
//swprintf(pszBuf, L"%s%d;%s=", poldBlob, len, pName);
StringCchPrintfW(pszBuf,dwSizePtr,L"%s%d;%s=", poldBlob, len, pName);
}
}
else
{
if (bHasValue)
//SWI
//swprintf(pszBuf, L"%d;%s=%s", len, pName, pValue);
StringCchPrintfW(pszBuf,dwSizePtr, L"%d;%s=%s", len, pName, pValue);
else
//SWI
//swprintf(pszBuf, L"%d;%s=", len, pName);
StringCchPrintfW(pszBuf,dwSizePtr, L"%d;%s=", len, pName);
}
done:
*pnewBlob = ::SysAllocString(pszBuf);
if (pszBuf) delete pszBuf;
return S_OK;
}
BOOL CreateRAIncidentDirectory(LPTSTR path, LPCTSTR subPath)
{
BOOL bRetVal = FALSE;
TCHAR seps[] = _T("\\");
LPTSTR ptrDirPath = NULL;
LPTSTR ptrSubDirPath = NULL;
DWORD dwSizePtrDir=0,dwSizePtrSubDir=0;
HRESULT hr=S_OK;
//SWI
dwSizePtrDir=strlen(path) + strlen(subPath) + 1;
ptrDirPath = new TCHAR[dwSizePtrDir];
if (ptrDirPath == NULL)
{
bRetVal = FALSE;
goto done;
}
//SWI
//lstrcpy(ptrDirPath,path);
hr=StringCchCopy(ptrDirPath,dwSizePtrDir,path);
if(FAILED(hr))
{
bRetVal = FALSE;
goto done;
}
dwSizePtrSubDir=strlen(subPath) + 1;
ptrSubDirPath = new TCHAR[dwSizePtrSubDir];
if (ptrSubDirPath == NULL)
{
bRetVal = FALSE;
goto done;
}
//SWI
//lstrcpy(ptrSubDirPath,subPath);
hr=StringCchCopy(ptrSubDirPath,dwSizePtrSubDir,subPath);
if(FAILED(hr))
{
bRetVal = FALSE;
goto done;
}
LPTSTR token;
token= _tcstok(ptrSubDirPath, seps);
while( token != NULL )
{
//lstrcat(ptrDirPath,_T("\\"));
//lstrcat(ptrDirPath,token);
hr=StringCchCat(ptrDirPath,dwSizePtrDir,_T("\\"));
if(FAILED(hr))
{
bRetVal = FALSE;
goto done;
}
hr=StringCchCat(ptrDirPath,dwSizePtrDir,token);
if(FAILED(hr))
{
bRetVal = FALSE;
goto done;
}
//MessageBox(NULL,ptrDirPath,token,MB_OK);
if (CreateDirectory(ptrDirPath,NULL) == 0)
{
DWORD err = GetLastError();
if ((err != ERROR_ALREADY_EXISTS) && (err != ERROR_SUCCESS))
{
bRetVal = FALSE;
goto done;
}
}
/* Get next token: */
token = _tcstok(NULL, seps);
}
bRetVal = TRUE;
done:
if (ptrDirPath)
delete ptrDirPath;
if (ptrSubDirPath)
delete ptrSubDirPath;
return bRetVal;
}