217 lines
4.8 KiB
C++
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;
|
||
|
}
|