windows-nt/Source/XPSP1/NT/base/win32/fusion/appweek/host/chost.cpp
2020-09-26 16:20:57 +08:00

217 lines
4.8 KiB
C++

#include "stdinc.h"
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include "SxApwHandle.h"
#include "SxApwCreate.h"
#include "SxApwComPtr.h"
#include "chost.h"
#define NUMBER_OF(x) (sizeof(x)/sizeof((x)[0]))
const static
PCWSTR s_dbQueries[] =
{
L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\fusiontest\\sxs\\appweek\\nwind.mdb;"
L"|SELECT * from employees",
L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\fusiontest\\sxs\\appweek\\nwind.mdb;"
L"|SELECT title from employees",
};
std::wstring MultiByteToWideChar( const std::string& source )
{
std::vector<WCHAR> wch;
wch.resize( MultiByteToWideChar( CP_ACP, 0, source.data(), source.size(), NULL, 0 ) );
MultiByteToWideChar( CP_ACP, 0, source.data(), source.size(), &wch.front(), wch.size() );
return std::wstring( wch.begin(), wch.end() );
}
STDMETHODIMP
CSxApwHost::OnRowCountEstimateAvailable(
int nRows
)
{
/*
just multiplex/broadcast the data across all the views..
*/
for (Views_t::const_iterator i = m_views.begin(); i != m_views.end() ; ++i)
{
(*i)->OnRowCountEstimateAvailable(nRows);
}
return S_OK;
}
STDMETHODIMP
CSxApwHost::OnNextRow(
int nColumns,
const PCWSTR* columns
)
{
/*
just multiplex/broadcast the data across all the views..
*/
for (Views_t::const_iterator i = m_views.begin(); i != m_views.end() ; ++i)
{
(*i)->OnNextRow(nColumns, columns);
}
return S_OK;
}
STDMETHODIMP
CSxApwHost::InformSchema(
const SxApwColumnInfo rgColumnInfo[],
int nColumnCount
)
{
/*
just multiplex/broadcast the data across all the views..
*/
for (Views_t::const_iterator i = m_views.begin(); i != m_views.end() ; ++i)
{
(*i)->InformSchema(rgColumnInfo, nColumnCount);
}
return S_OK;
}
STDMETHODIMP
CSxApwHost::SetDataSource(
LPCWSTR datasource
)
{
HRESULT hr;
if (FAILED(hr = SxApwCreateObject(datasource, SXAPW_CREATEOBJECT_NOWRAP, m_dataSource)))
goto Exit;
Exit:
return hr;
}
STDMETHODIMP
CSxApwHost::CreateView(
LPCWSTR view
)
{
HRESULT hr;
CSxApwComPtr<ISxApwUiView> iview;
HWND hWnd = NULL /* UNDONE */;
if (FAILED(hr = SxApwCreateObject(view, SXAPW_CREATEOBJECT_NOWRAP, iview)))
goto Exit;
if (FAILED(hr = iview->CreateWindow(hWnd)))
goto Exit;
m_views.push_back(iview);
Exit:
return hr;
}
STDMETHODIMP
CSxApwHost::RunQuery(
LPCWSTR query
)
{
HRESULT hr;
if (FAILED(hr = m_dataSource->RunQuery(query)))
goto Exit;
Exit:
return hr;
}
HRESULT CSxApwHost::Main()
{
std::ifstream inStream;
HRESULT hr;
CSxApwComPtr<ISxApwDataSource> dirSource;
CSxApwComPtr<ISxApwDataSource> dbSource;
if (FAILED(hr = SetDataSource(CLSID_CSxApwDirDataSource_brace_stringW)))
goto Exit;
if (FAILED(hr = SetDataSource(CLSID_CSxApwDbDataSource_brace_stringW)))
goto Exit;
if (FAILED(hr = CreateView(CLSID_CSxApwStdoutView_brace_stringW)))
goto Exit;
if (FAILED(hr = dirSource->SetSite(this)))
goto Exit;
if (FAILED(hr = dirSource->RunQuery(L"C:\\*")))
goto Exit;
inStream.open("dbqueries.txt");
if (!inStream.is_open())
{
hr = E_FAIL;
goto Exit;
}
while (!inStream.eof())
{
std::string line;
std::getline(inStream, line);
if (line.empty())
{
break;
}
std::wstring wLine = MultiByteToWideChar(line);
if (FAILED(hr = dbSource->SetSite(this)))
goto Exit;
if (FAILED(hr = dbSource->RunQuery(wLine.c_str())))
goto Exit;
}
Exit:
return hr;
}
//
// DSQuery
///////////////////////////////////////////////////////////////////////////
HRESULT CSxApwHost::DSQuery(int nDataSourceType, int nViewType, PCWSTR query, HWND hWnd)
{
HRESULT hr;
const static PCWSTR dataSourceClsIds[] =
{ CLSID_CSxApwDirDataSource_brace_stringW, CLSID_CSxApwDbDataSource_brace_stringW };
const static PCWSTR viewClsIds[] =
{ CLSID_CSxApwGDIPlusView_brace_stringW, CLSID_CSxApwEditView_brace_stringW, CLSID_CSxApwStdoutView_brace_stringW, CLSID_CSxApwComctl32View_brace_stringW };
nDataSourceType -= 1;
if (nDataSourceType >= 0 && nDataSourceType < NUMBER_OF(dataSourceClsIds))
{
if (FAILED(hr = SetDataSource(dataSourceClsIds[nDataSourceType])))
{
goto Exit;
}
}
else
{
hr = E_INVALIDARG;
goto Exit;
}
nViewType -= 1;
if ( (nViewType >= 0) && (nViewType < NUMBER_OF(viewClsIds)) )
{
if (FAILED(hr = CreateView(viewClsIds[nViewType])))
goto Exit;
}
else
{
hr = E_INVALIDARG;
goto Exit;
}
if (FAILED(hr = m_dataSource->SetSite(this)))
goto Exit;
if (FAILED(hr = m_dataSource->RunQuery(query)))
goto Exit;
Exit:
return hr;
}