📄 simplepointworkspacehelper.cpp
字号:
// SimplePointWorkspaceHelper.cpp : Implementation of CSimplePointWorkspaceHelper
#include "stdafx.h"
#include "SimplePointVC.h"
#include "SimplePointWorkspaceHelper.h"
#include "GeneralUtils.h"
/////////////////////////////////////////////////////////////////////////////
// CSimplePointWorkspaceHelper
STDMETHODIMP CSimplePointWorkspaceHelper::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ISimplePointWorkspaceHelper
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
// IPlugInWorkspaceHelper
STDMETHODIMP CSimplePointWorkspaceHelper::get_RowCountIsCalculated(VARIANT_BOOL *rowCountCalculated)
{
if (! rowCountCalculated) return E_POINTER;
*rowCountCalculated = VARIANT_TRUE;
return S_OK;
}
STDMETHODIMP CSimplePointWorkspaceHelper::get_OIDIsRecordNumber(VARIANT_BOOL *OIDIsRecordNumber)
{
if (! OIDIsRecordNumber) return E_POINTER;
*OIDIsRecordNumber = VARIANT_TRUE;
return S_OK;
}
STDMETHODIMP CSimplePointWorkspaceHelper::get_NativeType(esriDatasetType DatasetType, BSTR localName, INativeType **ppNativeType)
{
// We are not implementing native types
return E_NOTIMPL;
}
STDMETHODIMP CSimplePointWorkspaceHelper::get_DatasetNames(esriDatasetType DatasetType, IArray **DatasetNames)
{
HRESULT hr;
USES_CONVERSION;
if (! DatasetNames) return E_POINTER;
// Create an empty array
IArrayPtr ipArray;
hr = ipArray.CreateInstance(CLSID_Array);
if (FAILED(hr)) return hr;
// the only two that we support
if (DatasetType != esriDTAny && DatasetType != esriDTFeatureClass)
{
*DatasetNames = ipArray.Detach(); // pass ownership of object to client;
return S_FALSE;
}
// look for each file with the correct extension
// first make a file filter path e.g. "D:/data/*.spt"
CComBSTR sPathFilter = m_sWorkspacePath;
sPathFilter.Append(L"*");
sPathFilter.Append(g_sExt);
// try to find the first file.
HANDLE hSearch;
WIN32_FIND_DATA findData;
hSearch = ::FindFirstFile( OLE2CT(sPathFilter), &findData);
if (hSearch == INVALID_HANDLE_VALUE)
{
*DatasetNames = ipArray.Detach(); // pass ownership of object to client;
return S_FALSE;
}
// Create the dataset helper for the first file
IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
CComBSTR fileName = T2OLE(findData.cFileName);
hr = CreatePlugInDatasetHelper(fileName, &ipPlugInDatasetInfo);
if (FAILED(hr)) return hr;
// Add it to the array - no need to call Addref, since the Add method will do it.
IUnknownPtr ipUnk = ipPlugInDatasetInfo;
ipArray->Add(ipUnk);
// for each additional file
while (0 != FindNextFile(hSearch, &findData))
{
fileName = findData.cFileName;
// Create the the dataset helper
// note - the & operator releases the previous object
hr = CreatePlugInDatasetHelper(fileName, &ipPlugInDatasetInfo);
if (FAILED(hr)) return hr;
IUnknownPtr ipUnk = ipPlugInDatasetInfo;
ipArray->Add(ipUnk);
}
*DatasetNames = ipArray.Detach(); // pass ownership of object to client;
::FindClose(hSearch);
return S_OK;
}
STDMETHODIMP CSimplePointWorkspaceHelper::OpenDataset(BSTR localName, IPlugInDatasetHelper **datasetHelper)
{
HRESULT hr;
USES_CONVERSION;
if (! datasetHelper) return E_POINTER;
CComBSTR sFileName = localName;
sFileName.Append(g_sExt);
// Check if the dataset is valid
CComBSTR sFullPath = m_sWorkspacePath;
sFullPath.Append(sFileName);
if (!FileExists(OLE2CT(sFullPath)))
{
CComBSTR sError(L"Dataset does not exist: ");
sError.Append(localName);
AtlReportError(CLSID_SimplePointWorkspaceHelper, sError, IID_IPlugInWorkspaceHelper, E_FAIL);
return E_FAIL;
}
// Create the dataset helper
IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
hr = CreatePlugInDatasetHelper(sFileName, &ipPlugInDatasetInfo);
if (FAILED(hr)) return hr;
IPlugInDatasetHelperPtr ipPlugInDatasetHelper = ipPlugInDatasetInfo;
if (ipPlugInDatasetHelper == NULL) return E_FAIL;
*datasetHelper = ipPlugInDatasetHelper.Detach(); // pass ownership of object to client;
return S_OK;
}
// ISimplePointWorkspaceHelper methods
STDMETHODIMP CSimplePointWorkspaceHelper::put_WorkspacePath(BSTR newVal)
{
m_sWorkspacePath = newVal;
if (m_sWorkspacePath.Length() == 0) return E_FAIL;
if (m_sWorkspacePath[m_sWorkspacePath.Length() - 1] != L'\\')
m_sWorkspacePath.Append(L"\\");
return S_OK;
}
// helper functions
HRESULT CSimplePointWorkspaceHelper::CreatePlugInDatasetHelper(BSTR fileName, IPlugInDatasetInfo ** ppPlugInDatasetInfo)
{
HRESULT hr;
if (! ppPlugInDatasetInfo) return E_POINTER;
IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
// First check to see if the specified dataset is already in our cache
PlugInDatasets::iterator p;
p = m_mapDatasets.find(fileName);
if (p != m_mapDatasets.end())
{
ipPlugInDatasetInfo = p->second;
}
else
{
// Create the new object
ISimplePointDatasetHelperPtr ipSimplePointDatasetHelper;
hr = ipSimplePointDatasetHelper.CreateInstance(CLSID_SimplePointDatasetHelper);
if (FAILED(hr)) return hr;
// Initialize it with the dataset name, first strip off the file extension
TCHAR str[_MAX_PATH];
::_tcscpy(str, OLE2CT(fileName));
str[_tcslen(str) - g_sExt.Length()] = _T('\0');
CComBSTR sDatasetName = T2OLE(str);
hr = ipSimplePointDatasetHelper->put_DatasetName(sDatasetName);
if (FAILED(hr)) return hr;
// Initialize it with the workspace path
hr = ipSimplePointDatasetHelper->put_WorkspacePath(m_sWorkspacePath);
if (FAILED(hr)) return hr;
// QI for the IPlugInDatasetInfo
ipPlugInDatasetInfo = ipSimplePointDatasetHelper;
if (ipPlugInDatasetInfo == NULL) return E_FAIL;
// Add it to the cache
m_mapDatasets.insert(PlugInDatasets::value_type(fileName, ipPlugInDatasetInfo));
}
*ppPlugInDatasetInfo = ipPlugInDatasetInfo.Detach();
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -