//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 1997. // // File: iismrshl.cxx // // Contents: IIS marshalling code // // Functions: // // History: 27-Feb-97 Sophiac Created. // //---------------------------------------------------------------------------- #include "iis.hxx" #define MAX_PATH_MULTISZ_STRING 256 #define MAX_PATH_MIMEMAP_STRING 100 PMETADATA_RECORD CopyIISSynIdDWORD_To_IISDWORD( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject ) { DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = DWORD_METADATA; pMetaDataRec->dwMDDataLen = sizeof(DWORD); pMetaDataRec->pbMDData = (LPBYTE)&(lpIISObject->IISValue.value_1.dwDWORD); return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdSTRING_To_IISSTRING( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject ) { DWORD dwStatus = 0; DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; LPWSTR pszData = NULL; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = STRING_METADATA; pMetaDataRec->dwMDDataLen = 0; if (lpIISObject) { pszData = AllocADsStr((LPWSTR)lpIISObject->IISValue.value_2.String); if (!pszData) { return(pMetaDataRec); } pMetaDataRec->dwMDDataLen = ((DWORD)wcslen(pszData) + 1)*2; } pMetaDataRec->pbMDData = (LPBYTE)pszData; return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdEXPANDSZ_To_IISEXPANDSZ( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject ) { DWORD dwStatus = 0; DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; LPWSTR pszData = NULL; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = EXPANDSZ_METADATA; pMetaDataRec->dwMDDataLen = 0; if (lpIISObject) { pszData = AllocADsStr((LPWSTR)lpIISObject->IISValue.value_3.ExpandSz); if (!pszData) { return(pMetaDataRec); } pMetaDataRec->dwMDDataLen = ((DWORD)wcslen(pszData) + 1)*2; } pMetaDataRec->pbMDData = (LPBYTE)pszData; return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdMULTISZ_To_IISMULTISZ( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject, DWORD dwNumValues ) { DWORD dwStatus = 0; DWORD i; DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; LPWSTR pszStr = NULL; LPWSTR pszData = NULL; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = MULTISZ_METADATA; pMetaDataRec->dwMDDataLen = 0; // // Calculate buffer length to allocate // for (i = 0; i < dwNumValues; i++) { pszData = (LPWSTR)lpIISObject[i].IISValue.value_4.MultiSz; pMetaDataRec->dwMDDataLen += ((DWORD)wcslen(pszData) + 1)*2; } // // +2 for the extra null terminator // pszStr = (LPWSTR) AllocADsMem(pMetaDataRec->dwMDDataLen + 2); if (pszStr == NULL) { return(pMetaDataRec); } // // empty contents // wcscpy(pszStr, L""); pMetaDataRec->pbMDData = (LPBYTE)pszStr; for (i = 0; i < dwNumValues; i++) { pszData = (LPWSTR)lpIISObject[i].IISValue.value_4.MultiSz; wcscat(pszStr, pszData); pszStr += wcslen(pszData); *pszStr = L'\0'; pszStr++; } *pszStr = L'\0'; pMetaDataRec->dwMDDataLen += 2; return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdBINARY_To_IISBINARY( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject ) { DWORD dwStatus = 0; DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; LPBYTE pBuffer = NULL; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = BINARY_METADATA; pMetaDataRec->dwMDDataLen = 0; pBuffer = (LPBYTE) AllocADsMem( lpIISObject->IISValue.value_5.Length); if (!pBuffer) { return(pMetaDataRec); } memcpy(pBuffer, lpIISObject->IISValue.value_5.Binary, lpIISObject->IISValue.value_5.Length); pMetaDataRec->pbMDData = (LPBYTE)pBuffer; pMetaDataRec->dwMDDataLen = lpIISObject->IISValue.value_5.Length; return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdMIMEMAP_To_IISMIMEMAP( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject, DWORD dwNumValues ) { DWORD dwStatus = 0; DWORD i; DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; LPWSTR pszData = NULL; LPWSTR pszStr = NULL; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = MULTISZ_METADATA; pMetaDataRec->dwMDDataLen = 0; // // Calculate buffer length to allocate // for (i = 0; i < dwNumValues; i++) { pszData = (LPWSTR)lpIISObject[i].IISValue.value_4.MultiSz; pMetaDataRec->dwMDDataLen += ((DWORD)wcslen(pszData) + 1)*2; } // // +2 for the extra null terminator // pszStr = (LPWSTR) AllocADsMem(pMetaDataRec->dwMDDataLen + 2); if (pszStr == NULL) { return(pMetaDataRec); } // // empty contents // wcscpy(pszStr, L""); pMetaDataRec->pbMDData = (LPBYTE)pszStr; for (i = 0; i < dwNumValues; i++) { pszData = (LPWSTR)lpIISObject[i].IISValue.value_4.MultiSz; wcscat(pszStr, pszData); pszStr += wcslen(pszData); *pszStr = L'\0'; pszStr++; } *pszStr = L'\0'; pMetaDataRec->dwMDDataLen += 2; return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdBOOL_To_IISBOOL( IIsSchema *pSchema, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject ) { DWORD dwAttribute = ALL_METADATA; DWORD dwUserType = ALL_METADATA; pSchema->LookupMDFlags(dwMetaId, &dwAttribute, &dwUserType); pMetaDataRec->dwMDIdentifier = dwMetaId; pMetaDataRec->dwMDAttributes = dwAttribute; pMetaDataRec->dwMDUserType = dwUserType; pMetaDataRec->dwMDDataType = DWORD_METADATA; pMetaDataRec->dwMDDataLen = sizeof(DWORD); pMetaDataRec->pbMDData = (LPBYTE)&(lpIISObject->IISValue.value_1.dwDWORD); return(pMetaDataRec); } PMETADATA_RECORD CopyIISSynIdToIIS( IIsSchema *pSchema, DWORD dwSyntaxId, DWORD dwMetaId, PMETADATA_RECORD pMetaDataRec, PIISOBJECT lpIISObject, DWORD dwNumValues ) { switch (dwSyntaxId) { case IIS_SYNTAX_ID_DWORD: pMetaDataRec = CopyIISSynIdDWORD_To_IISDWORD( pSchema, dwMetaId, pMetaDataRec, lpIISObject ); break; case IIS_SYNTAX_ID_STRING: pMetaDataRec = CopyIISSynIdSTRING_To_IISSTRING( pSchema, dwMetaId, pMetaDataRec, lpIISObject ); break; case IIS_SYNTAX_ID_EXPANDSZ: pMetaDataRec = CopyIISSynIdEXPANDSZ_To_IISEXPANDSZ( pSchema, dwMetaId, pMetaDataRec, lpIISObject ); break; case IIS_SYNTAX_ID_MULTISZ: pMetaDataRec = CopyIISSynIdMULTISZ_To_IISMULTISZ( pSchema, dwMetaId, pMetaDataRec, lpIISObject, dwNumValues ); break; case IIS_SYNTAX_ID_BINARY: case IIS_SYNTAX_ID_IPSECLIST: case IIS_SYNTAX_ID_NTACL: pMetaDataRec = CopyIISSynIdBINARY_To_IISBINARY( pSchema, dwMetaId, pMetaDataRec, lpIISObject ); break; case IIS_SYNTAX_ID_MIMEMAP: pMetaDataRec = CopyIISSynIdMIMEMAP_To_IISMIMEMAP( pSchema, dwMetaId, pMetaDataRec, lpIISObject, dwNumValues ); break; case IIS_SYNTAX_ID_BOOL: case IIS_SYNTAX_ID_BOOL_BITMASK: pMetaDataRec = CopyIISSynIdBOOL_To_IISBOOL( pSchema, dwMetaId, pMetaDataRec, lpIISObject ); break; default: break; } return(pMetaDataRec); } HRESULT MarshallIISSynIdToIIS( IIsSchema *pSchema, DWORD dwSyntaxId, DWORD dwMDIdentifier, PIISOBJECT pIISObject, DWORD dwNumValues, PMETADATA_RECORD pMetaDataRecord ) { CopyIISSynIdToIIS( pSchema, dwSyntaxId, dwMDIdentifier, pMetaDataRecord, pIISObject, dwNumValues ); RRETURN(S_OK); }