HRESULT ShellCallback::Read( DWORD dwNumItems, CTag ** ppTags, HRESULT * pErrors )
{
CSLock wait(&m_CS);
if( NULL == m_hConn )
{
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = 0xF2000000;
}
return E_FAIL;
}
if( dwNumItems <= 0 || NULL == ppTags || NULL == pErrors )
{
return S_OK;
}
//获取授权证书校验结果
if( !m_pApp->m_verifyStateMgt.IsVerifyRight() )
{
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = 0xF3000000;
}
return E_FAIL;
}
HTAG * phTags = new HTAG[dwNumItems];
if( NULL == phTags )
{
return E_OUTOFMEMORY;
}
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
phTags[i] = pShellTag->m_hTag;
pErrors[i] = S_OK;
}
//批量读取位号值
HRESULT * pRes = NULL;
TAGVALSTATE * pVal = NULL;
HRESULT hRtn = ReadTagsValue( m_hConn, dwNumItems, phTags, &pRes, &pVal );
if( S_OK != hRtn )
{
delete[] phTags;
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = hRtn;
}
return E_FAIL;
}
DWORD dwErrNum = 0;
for( i = 0; i < dwNumItems; i++ )
{
pErrors[i] = pRes[i];
if( S_OK != pErrors[i] )
{
dwErrNum++;
::VariantClear( &(pVal[i].vEng_value) );
continue;
}
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pShellTag->m_quality = pVal[i].wQuality; //质量码
pShellTag->m_timestamp = pVal[i].ftTimeStamp; //时间戳
::VariantClear( &(pShellTag->m_value) ); //位号值
ChangeToRequestValue( pVal[i].vEng_value, pShellTag );
::VariantClear( &(pVal[i].vEng_value) );
}
::CoTaskMemFree(pRes);
::CoTaskMemFree(pVal);
delete[] phTags;
//返回结果
if( dwErrNum <= 0 )
{
return S_OK;
}
if( dwErrNum >= dwNumItems )
{
return E_FAIL;
}
return S_FALSE;
}
{
CSLock wait(&m_CS);
if( NULL == m_hConn )
{
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = 0xF2000000;
}
return E_FAIL;
}
if( dwNumItems <= 0 || NULL == ppTags || NULL == pErrors )
{
return S_OK;
}
//获取授权证书校验结果
if( !m_pApp->m_verifyStateMgt.IsVerifyRight() )
{
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = 0xF3000000;
}
return E_FAIL;
}
HTAG * phTags = new HTAG[dwNumItems];
if( NULL == phTags )
{
return E_OUTOFMEMORY;
}
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
phTags[i] = pShellTag->m_hTag;
pErrors[i] = S_OK;
}
//批量读取位号值
HRESULT * pRes = NULL;
TAGVALSTATE * pVal = NULL;
HRESULT hRtn = ReadTagsValue( m_hConn, dwNumItems, phTags, &pRes, &pVal );
if( S_OK != hRtn )
{
delete[] phTags;
for( DWORD i = 0; i < dwNumItems; i++ )
{
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pErrors[i] = hRtn;
}
return E_FAIL;
}
DWORD dwErrNum = 0;
for( i = 0; i < dwNumItems; i++ )
{
pErrors[i] = pRes[i];
if( S_OK != pErrors[i] )
{
dwErrNum++;
::VariantClear( &(pVal[i].vEng_value) );
continue;
}
ShellTag * pShellTag = (ShellTag*)(ppTags[i]);
pShellTag->m_quality = pVal[i].wQuality; //质量码
pShellTag->m_timestamp = pVal[i].ftTimeStamp; //时间戳
::VariantClear( &(pShellTag->m_value) ); //位号值
ChangeToRequestValue( pVal[i].vEng_value, pShellTag );
::VariantClear( &(pVal[i].vEng_value) );
}
::CoTaskMemFree(pRes);
::CoTaskMemFree(pVal);
delete[] phTags;
//返回结果
if( dwErrNum <= 0 )
{
return S_OK;
}
if( dwErrNum >= dwNumItems )
{
return E_FAIL;
}
return S_FALSE;
}