;**************************************************************************
;*  CLASS2.ASM
;*
;*      Assembly support for the class enumeration routines.
;*
;**************************************************************************

        INCLUDE TOOLPRIV.INC

PMODE32 = 0
PMODE   = 0
SWAPPRO = 0
        INCLUDE TDB.INC

;** Class structure
CLS STRUC
cls_pclsNext    DW      ?
cls_clsMagic    DW      ?
cls_atom        DW      ?
cls_pdce        DW      ?
cls_RefCount    DW      ?
cls_style       DW      ?
cls_lpfnWndProc DD      ?
cls_cbclsExtra  DW      ?
cls_cbwndExtra  DW      ?
cls_hInstance   DW      ?
cls_hIcon       DW      ?
cls_hCursor     DW      ?
cls_hbrBackgr   DW      ?
cls_lpszMnName  DW      ?
cls_lpszClsName DW      ?
CLS ENDS

;** External functions
externNP HelperVerifySeg
externFP GetAtomName

;** Functions

sBegin  CODE
        assumes CS,CODE

;  ClassInfo
;
;       Returns information about the class with the given block handle

cProc   ClassInfo, <PUBLIC,NEAR>, <si,di,ds>
        parmD   lpClass
        parmW   wOffset
cBegin
        ;** Start by verifying that we can read the segment here
        mov     ax,hUserHeap            ;Get the selector
        mov     bx,wOffset              ;  and the desired offset
        cCall   HelperVerifySeg, <ax,bx>
        or      ax,ax                   ;FALSE return?
        jnz     CI_SelOk                ;We're OK
        xor     ax,ax                   ;Return FALSE
        jmp     CI_End
CI_SelOk:

        ;** Point to the CLS structure with DS:SI.  Note that using DS to
        ;**     point to USER's DS is useful to get USER's local atoms
        mov     ax,hUserHeap            ;User's heap is User's DGROUP
        mov     ds,ax
        mov     si,wOffset              ;Get a pointer to the CLS structure

        ;** Copy the hInstance
        les     di,lpClass              ;Get the structure
        mov     ax,[si].cls_hInstance   ;Get the hInst of the class owner
        mov     es:[di].ce_hInst,ax     ;Save in the CLASSENTRY struct  

        ;** Get the string from the atom and copy the next pointer
        mov     ax,[si].cls_atom        ;Get the desired atom number
        lea     bx,[di].ce_szClassName  ;Get the offset to copy string to
        push    es                      ;Save ES (GetAtomName may trash)
        mov     cx,MAX_CLASSNAME        ;Get max classname length
        cCall   GetAtomName, <ax,es,bx,cx> ;Copy the atom string
        pop     es
        or      ax,ax                   ;OK?
        jnz     CI_20                   ;Yes
        mov     es:[di].ce_szClassName,0 ;No.  Clear the string
CI_20:  mov     ax,[si].cls_pclsNext    ;Get the next pointer
        mov     es:[di].ce_wNext,ax     ;Save it

        ;** Return TRUE on success
        mov     ax,TRUE
CI_End:
cEnd

sEnd

        END