Ejemplo n.º 1
0
unsigned char *DGNGetLinkage( DGNHandle hDGN, DGNElemCore *psElement, 
                              int iIndex, int *pnLinkageType,
                              int *pnEntityNum, int *pnMSLink, int *pnLength )
    
{
    int nAttrOffset;
    int iLinkage, nLinkSize;

    for( iLinkage=0, nAttrOffset=0;
         (nLinkSize = DGNGetAttrLinkSize( hDGN, psElement, nAttrOffset)) != 0;
         iLinkage++, nAttrOffset += nLinkSize )
    {
        if( iLinkage == iIndex )
        {
            int  nLinkageType=0, nEntityNum=0, nMSLink = 0;
            CPLAssert( nLinkSize > 4 );

            if( psElement->attr_data[nAttrOffset+0] == 0x00
                && (psElement->attr_data[nAttrOffset+1] == 0x00
                    || psElement->attr_data[nAttrOffset+1] == 0x80) )
            {
                nLinkageType = DGNLT_DMRS;
                nEntityNum = psElement->attr_data[nAttrOffset+2] 
                    + psElement->attr_data[nAttrOffset+3] * 256;
                nMSLink = psElement->attr_data[nAttrOffset+4] 
                    + psElement->attr_data[nAttrOffset+5] * 256
                    + psElement->attr_data[nAttrOffset+6] * 65536;
            }
            else
                nLinkageType = psElement->attr_data[nAttrOffset+2] 
                    + psElement->attr_data[nAttrOffset+3] * 256;

            // Possibly an external database linkage?
            if( nLinkSize == 16 && nLinkageType != DGNLT_SHAPE_FILL )
            {
                nEntityNum = psElement->attr_data[nAttrOffset+6] 
                    + psElement->attr_data[nAttrOffset+7] * 256;
                nMSLink = psElement->attr_data[nAttrOffset+8] 
                    + psElement->attr_data[nAttrOffset+9] * 256
                    + psElement->attr_data[nAttrOffset+10] * 65536
                    + psElement->attr_data[nAttrOffset+11] * 65536 * 256;
                
            }

            if( pnLinkageType != NULL )
                *pnLinkageType = nLinkageType;
            if( pnEntityNum != NULL )
                *pnEntityNum = nEntityNum;
            if( pnMSLink != NULL )
                *pnMSLink = nMSLink;
            if( pnLength != NULL )
                *pnLength = nLinkSize;

            return psElement->attr_data + nAttrOffset;
        }
    }
             
    return NULL;
}
Ejemplo n.º 2
0
unsigned char *DGNGetLinkage( DGNHandle hDGN, DGNElemCore *psElement,
                              int iIndex, int *pnLinkageType,
                              int *pnEntityNum, int *pnMSLink, int *pnLength )

{
    int nLinkSize = 0;

    for( int iLinkage=0, nAttrOffset=0;
         (nLinkSize = DGNGetAttrLinkSize( hDGN, psElement, nAttrOffset)) != 0;
         iLinkage++, nAttrOffset += nLinkSize )
    {
        if( iLinkage == iIndex )
        {
            if( nLinkSize <= 4 )
            {
                CPLError(CE_Failure, CPLE_AssertionFailed, "nLinkSize <= 4");
                return nullptr;
            }
            if( nLinkSize + nAttrOffset > psElement->attr_bytes )
            {
                CPLError(CE_Failure, CPLE_AssertionFailed,
                         "nLinkSize + nAttrOffset > psElement->attr_bytes");
                return nullptr;
            }

            int nLinkageType = 0;
            int nEntityNum = 0;
            int nMSLink = 0;
            if( psElement->attr_bytes >= nAttrOffset + 7 &&
                psElement->attr_data[nAttrOffset+0] == 0x00
                && (psElement->attr_data[nAttrOffset+1] == 0x00
                    || psElement->attr_data[nAttrOffset+1] == 0x80) )
            {
                nLinkageType = DGNLT_DMRS;
                nEntityNum = psElement->attr_data[nAttrOffset+2]
                    + psElement->attr_data[nAttrOffset+3] * 256;
                nMSLink = psElement->attr_data[nAttrOffset+4]
                    + psElement->attr_data[nAttrOffset+5] * 256
                    + psElement->attr_data[nAttrOffset+6] * 65536;
            }
            else if( psElement->attr_bytes >= nAttrOffset + 4 )
                nLinkageType = psElement->attr_data[nAttrOffset+2]
                    + psElement->attr_data[nAttrOffset+3] * 256;

            // Possibly an external database linkage?
            if( nLinkSize == 16 && nLinkageType != DGNLT_SHAPE_FILL &&
                psElement->attr_bytes >= nAttrOffset + 12 )
            {
                nEntityNum = psElement->attr_data[nAttrOffset+6]
                    + psElement->attr_data[nAttrOffset+7] * 256;
                nMSLink = psElement->attr_data[nAttrOffset+8]
                    | (psElement->attr_data[nAttrOffset+9] << 8)
                    | (psElement->attr_data[nAttrOffset+10] << 16)
                    | (psElement->attr_data[nAttrOffset+11] << 24);
            }

            if( pnLinkageType != nullptr )
                *pnLinkageType = nLinkageType;
            if( pnEntityNum != nullptr )
                *pnEntityNum = nEntityNum;
            if( pnMSLink != nullptr )
                *pnMSLink = nMSLink;
            if( pnLength != nullptr )
                *pnLength = nLinkSize;

            return psElement->attr_data + nAttrOffset;
        }
    }

    return nullptr;
}