#include "stdinc.h" #include #include #include #include #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 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 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 dirSource; CSxApwComPtr 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; }