home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 8 / 08.iso / d / d026 / 25.ddi / NET / WNETPRNQ.AS_ / WNETPRNQ.AS
Encoding:
Text File  |  1991-10-15  |  18.7 KB  |  645 lines

  1. page        60, 132
  2. title        Windows Network Printing Functions
  3. ;===============================================================================
  4. ; Filename    MSNETPRN.ASM
  5. ; Copyright    (C) 1989 by Research Machines
  6. ;        (C) 1989-1990 by Microsoft Corp.
  7. ;===============================================================================
  8. ; REVISIONS:    24/02/1989    Initial version
  9. ;        15/03/1989    Update to spec 0.56
  10. ;                Add WNetOpenJob and WNetCloseJob
  11. ;        16/03/1989    Change to STANDARD procedures (save si, di, ds)
  12. ;        23/03/1989    Change to segment name / file name
  13. ;                Update to spec 0.58
  14. ;        29/03/1989    Change smbPQEOriginatorName to offset
  15. ;        31/03/1989    Added WNetWatchQueue.
  16. ;                Tidied up comments.
  17. ;                Called ERRSetErrorCode.
  18. ;        04/04/1989    Bug fix to WNetWatchQueue
  19. ;                Add WNetUnwatchQueue
  20. ;                Add WNetLockQueueData
  21. ;                Add WNetUnlockQueueData
  22. ;        05/05/1989    Update to spec 0.59
  23. ;        09/05/1989    Get LockQueueData working!
  24. ;        ever since    Bug fixes.
  25. ;===============================================================================
  26.  
  27.         memM    equ    1        ; Middle memory model
  28.         ?WIN    =    1        ; Windows prolog/epilog
  29.         ?PLM    =    1        ; Pascal calling convention
  30.  
  31.         .xlist
  32. include     cmacros.inc
  33. include     windows.inc
  34. include     wnet.inc
  35. include     wnetcaps.inc
  36. include     wnetprnt.inc
  37. include     smb.inc
  38.         .list
  39.  
  40.         .sall
  41.  
  42. ;===============================================================================
  43. ; ============= EXTERNAL FUNCTIONS =============================================
  44. ;===============================================================================
  45.  
  46. externFP    NETGetPrintQueue
  47.  
  48. externFP    UTLMemMove
  49.  
  50. externFP    UTLYearMonthDayToSeconds
  51. externFP    UTLHourMinuteSecondToSeconds
  52.  
  53. ;===============================================================================
  54. ; ============= CODE SEGMENT ===================================================
  55. ;===============================================================================
  56.  
  57. createSeg    _PRNT, PRNCODE, BYTE, PUBLIC, CODE
  58. sBegin        PRNCODE
  59.         assumes CS, PRNCODE
  60.         assumes DS, DATA
  61.  
  62. ;===============================================================================
  63. ; ============= STATIC FUNTIONS ================================================
  64. ;===============================================================================
  65.  
  66. ;===============================================================================
  67. subttl        SMBDateTimeToSeconds
  68. page
  69. ;===============================================================================
  70. ;
  71. ; DESCRIPTION . Convert a date into seconds
  72. ; ENTRY ....... nDate = yyyyyyy mmmm ddddd
  73. ;        nTime = hhhhh mmmmmm sssss
  74. ; EXIT ........ dx:ax = seconds elapsed since 1/1/1970
  75. ;
  76. ;===============================================================================
  77.  
  78. cProc SMBDateTimeToSeconds, <NEAR,PUBLIC>, <si, di>
  79.  
  80.     parmW   nDate
  81.     parmW   nTime
  82.  
  83. cBegin
  84.  
  85. ;---------------------------------------------------------------
  86. ; Extract hour, min, sec (actually, we blow off the seconds...)
  87. ;---------------------------------------------------------------
  88.  
  89.     mov     ax, nTime
  90.  
  91.     mov     cl, 5
  92.     shr     ax, cl
  93.     mov     si, ax            ; minutes in si
  94.     and     si, 63
  95.  
  96.     inc     cl                ; mov cl,6
  97.     shr     ax, cl
  98.     and     ax, 31
  99.     mov     di, ax            ; hours in di
  100.  
  101. ;---------------------------------------------------------------
  102. ; Extract year, month, day
  103. ;---------------------------------------------------------------
  104.  
  105.     mov     ax, nDate
  106.     mov     dx, ax
  107.     and     dx, 31        ; day in dx
  108.     dec     dx            ; make it zero based
  109.  
  110.     mov     cl, 5
  111.     shr     ax, cl
  112.     mov     bx, ax
  113.     and     bx, 15        ; month in bx
  114.     dec     bx            ; make it zero based
  115.  
  116.     mov     cl, 4
  117.     shr     ax, cl
  118.     and     ax, 127
  119.     add     ax, 8        ; convert to year since 1972 
  120.                                 ; (aligns to leap year)
  121.  
  122. ;---------------------------------------------------------------
  123. ; Convert year/month/day to seconds
  124. ;---------------------------------------------------------------
  125.  
  126.     cCall   UTLYearMonthDayToSeconds, <ax,bx,dx>
  127.  
  128.     xchg    si, ax
  129.     xchg    di, dx
  130.  
  131. ;---------------------------------------------------------------
  132. ; Convert hour/minute/second to seconds
  133. ;---------------------------------------------------------------
  134.  
  135.     sub     cx, cx                ; zero seconds...
  136.     cCall   UTLHourMinuteSecondToSeconds, <dx,ax,cx>
  137.  
  138.     add     ax, si
  139.     adc     dx, di
  140.  
  141.     add     ax, 6700h                ; Add 2 years of seconds (03c26700) 
  142.     adc     dx, 03c2h                ; to give the number of seconds since
  143.                                      ; 1970.
  144. cEnd
  145.  
  146. ;===============================================================================
  147. subttl        CompactEntry
  148. page
  149. ;===============================================================================
  150. ;
  151. ; DESCRIPTION .
  152. ; ENTRY .......
  153. ; EXIT ........
  154. ; COMMENTS ....
  155. ;
  156. ;===============================================================================
  157.  
  158. cProc        CompactEntry, <NEAR,PUBLIC>, <si, di>
  159.  
  160.     parmD   lpQueueEntries
  161.     parmW   nIndex
  162.     parmW   nEntriesInBuffer
  163.  
  164. cBegin
  165.  
  166. ;---------------------------------------------------------------
  167. ; Calculate a pointer to the entry to compress.
  168. ;---------------------------------------------------------------
  169.  
  170.         les    bx, ( lpQueueEntries )            ; Make ES:BX -> name
  171.         mov    ax, size SMBPrintQEntry         ;
  172.         mov    cx, ( nIndex )                ;
  173.         mul    cx                    ;
  174.         add    bx, ax                    ;
  175.         lea    bx, es: [ bx ].smbPQEOriginatorName    ;
  176.  
  177. ;---------------------------------------------------------------
  178. ; Calculate the number of bytes to compress.
  179. ;---------------------------------------------------------------
  180.  
  181.         mov    ax, ( nEntriesInBuffer )
  182.         sub    ax, ( nIndex )
  183.         dec    ax
  184.         jz    NoCompression                ; No comprendo
  185.  
  186.         mov    cx, size SMBPrintQEntry
  187.         sub    cx, size smbPQEOriginatorName
  188.         mul    cx
  189.         mov    cx, ax
  190.  
  191. ;---------------------------------------------------------------
  192. ; Calculate a pointer to the following entry.
  193. ;---------------------------------------------------------------
  194.  
  195.         mov    dx, es
  196.         mov    ax, bx
  197.         add    ax, size smbPQEOriginatorName
  198.  
  199. ;---------------------------------------------------------------
  200. ; Compress those entries.
  201. ;---------------------------------------------------------------
  202.  
  203.         Arg    RegPairEsBx                ; lpDestination
  204.         Arg    RegPairDxAx                ; lpSource
  205.         Arg    cx                    ; nCount
  206.         cCall    UTLMemMove                ; Write all over interrupt table
  207.  
  208. ;---------------------------------------------------------------
  209. ; Return to caller.
  210. ;---------------------------------------------------------------
  211.  
  212. NoCompression:
  213.  
  214. cEnd
  215.  
  216. ;===============================================================================
  217. subttl        MoveNamesDown
  218. page
  219. ;===============================================================================
  220. ;
  221. ; DESCRIPTION .
  222. ; ENTRY .......
  223. ; EXIT ........
  224. ; COMMENTS ....
  225. ;
  226. ;===============================================================================
  227.  
  228. cProc        MoveNamesDown, <NEAR,PUBLIC>, <si, di>
  229.  
  230.         parmD    lpQueueEntries
  231.         parmD    lpNameSpace
  232.         parmW    nEntriesInBuffer
  233.  
  234.         localW    nIndex
  235. cBegin
  236.  
  237. ;---------------------------------------------------------------
  238. ; Move all the originators names to the end of the buffer
  239. ;---------------------------------------------------------------
  240.  
  241.         mov    ax, ( nEntriesInBuffer )        ; Move backwards
  242.         dec    ax                    ; through the list
  243.         mov    ( nIndex ), ax                ; starting at the end.
  244.  
  245. MoveNameDown:    mov    ax, ( nIndex )                ; Have we finished?
  246.         cmp    ax, 0                    ;
  247.         jl    LastNameMoved                ;
  248.  
  249. ;---------------------------------------------------------------
  250. ; Get a pointer to the name in the SMB
  251. ;---------------------------------------------------------------
  252.  
  253.         les    bx, ( lpQueueEntries )            ; Make ES:BX -> name
  254.         mov    ax, size SMBPrintQEntry         ;
  255.         mov    cx, ( nIndex )                ;
  256.         mul    cx                    ;
  257.         add    bx, ax                    ;
  258.         lea    bx, es: [ bx ].smbPQEOriginatorName    ;
  259.  
  260. ;---------------------------------------------------------------
  261. ; Get a pointer to the 16 byte space at the end of the buffer
  262. ;---------------------------------------------------------------
  263.  
  264.         mov    ax, ( nIndex )                ; Make DX:AX -> space
  265.         mov    cx, size smbPQEOriginatorName        ;
  266.         mul    cx                    ;
  267.         add    ax, word ptr ( lpNameSpace + 0 )    ;
  268.         mov    dx, word ptr ( lpNameSpace + 2 )    ;
  269.  
  270. ;---------------------------------------------------------------
  271. ; Copy the name to the end of the buffer
  272. ;---------------------------------------------------------------
  273.  
  274.         ; zero terminate (leaving spaces)
  275.         mov    byte ptr es:[bx].(size smbPQEOriginatorName-1),0
  276.  
  277.         mov    cx, size smbPQEOriginatorName        ;
  278.  
  279.         Arg    RegPairDxAx                ; lpDestination
  280.         Arg    RegPairEsBx                ; lpSource
  281.         Arg    cx                    ; nCount
  282.         cCall    UTLMemMove                ;
  283.  
  284. ;---------------------------------------------------------------
  285. ; Compact the current queue entry by moving the following
  286. ; entries down and overwriting the originators name.
  287. ;---------------------------------------------------------------
  288.  
  289.         Arg    lpQueueEntries
  290.         Arg    nIndex
  291.         Arg    nEntriesInBuffer
  292.         cCall    CompactEntry
  293.  
  294. ;---------------------------------------------------------------
  295. ; Loop for next entry
  296. ;---------------------------------------------------------------
  297.  
  298.         dec    ( nIndex )                ;
  299.         jmp    short MoveNameDown            ;
  300.  
  301. ;---------------------------------------------------------------
  302. ; Return to the caller.
  303. ;---------------------------------------------------------------
  304.  
  305. LastNameMoved:
  306.  
  307. cEnd
  308.  
  309. ;===============================================================================
  310. subttl        ConvertEntries
  311. page
  312. ;===============================================================================
  313. ;
  314. ; DESCRIPTION .
  315. ; ENTRY .......
  316. ; EXIT ........
  317. ; COMMENTS ....
  318. ;
  319. ;===============================================================================
  320.  
  321. cProc        ConvertEntries, <NEAR,PUBLIC>, <si, di>
  322.  
  323.         parmD    lpqBuffer
  324.         parmD    lpNames
  325.         parmW    nEntriesInBuffer
  326.  
  327.         localW    nIndex
  328.         localW    nDate
  329.         localW    nTime
  330.         localW    nStatus
  331.         localW    nSpoolFileNumber
  332.         localD    lSize
  333.         localW    pUserName
  334. cBegin
  335.  
  336. ;---------------------------------------------------------------
  337. ; Convert all the entries in the buffer
  338. ;---------------------------------------------------------------
  339.  
  340.         mov    ax, ( nEntriesInBuffer )        ; Move backwards
  341.         dec    ax                    ; through the list
  342.         mov    ( nIndex ), ax                ; starting at the end.
  343.  
  344. ConvertEntry:    mov    ax, ( nIndex )                ; Have we finished?
  345.         cmp    ax, 0                    ;
  346.         jge    MoreToGo                ;
  347.         jmp    LastEntryConverted            ;
  348. MoreToGo:
  349.  
  350. ;---------------------------------------------------------------
  351. ; Get a pointer to the SMB entry
  352. ;---------------------------------------------------------------
  353.  
  354.         les    bx, ( lpqBuffer )            ; Make ES:BX -> SMB
  355.  
  356.         mov    ax, size SMBPrintQEntry         ;
  357.         sub    ax, size smbPQEOriginatorName        ;
  358.         mov    cx, ( nIndex )                ;
  359.         mul    cx                    ;
  360.         add    bx, ax                    ;
  361.  
  362. ;---------------------------------------------------------------
  363. ; Extract all the details of interest from the SMB
  364. ;---------------------------------------------------------------
  365.  
  366.         mov    ax, es: [ bx ].smbPQEDate        ; Time / date
  367.         mov    ( nDate ), ax                ;
  368.         mov    ax, es: [ bx ].smbPQETime        ;
  369.         mov    ( nTime ), ax                ;
  370.  
  371.         mov    al, es: [ bx ].smbPQEStatus        ; Status
  372.         mov    byte ptr ( nStatus ), al        ;
  373.  
  374.         mov    ax, es: [ bx ].smbPQESpoolFileNumber    ; Spool file number
  375.         mov    ( nSpoolFileNumber ), ax        ;
  376.  
  377.         mov    ax, word ptr es: [ bx ].smbPQESpoolFileSize + 0
  378.         mov    word ptr ( lSize + 0 ), ax
  379.         mov    ax, word ptr es: [ bx ].smbPQESpoolFileSize + 2
  380.         mov    word ptr ( lSize + 2 ), ax
  381.  
  382. ;---------------------------------------------------------------
  383. ; Convert some of the data as necessary
  384. ;---------------------------------------------------------------
  385.  
  386.         mov    cl, byte ptr ( nStatus )        ; cl = 1 to ff
  387.         dec    cl                    ; cl = 0 to fe
  388.         and    cl, 00000111b                ; cl = 0 to 3
  389.         shl    cl, 1                    ; cl = 0 to 6
  390.         shl    cl, 1                    ; cl = 0 to 12
  391.         mov    ax, 2031h                ; 0->1, 1->3, 2->0, 3->2
  392.         shr    ax, cl                    ;
  393.         and    ax, 0000000000000111b            ;
  394.         mov    ( nStatus ), ax             ;
  395.  
  396.         mov    dx, ( nDate )                ; Submitted
  397.         mov    ax, ( nTime )                ;
  398.         Arg    dx                    ;
  399.         Arg    ax                    ;
  400.         cCall    SMBDateTimeToSeconds            ;
  401.         mov    ( nDate ), dx                ;
  402.         mov    ( nTime ), ax                ;
  403.  
  404.         mov    ax, size smbPQEOriginatorName        ; pName
  405.         mov    cx, ( nIndex )                ;
  406.         mul    cx                    ;
  407.         add    ax, word ptr ( lpNames + 0 )        ;
  408.         sub    ax, word ptr ( lpqBuffer )        ;
  409.         mov    ( pUserName ), ax            ;
  410.  
  411. ;---------------------------------------------------------------
  412. ; Get a pointer to the JOBSTRUCT entry
  413. ;---------------------------------------------------------------
  414.  
  415.         les    bx, ( lpqBuffer )            ; Make ES:BX -> JOBSTRUCT
  416.         add    bx, size QUEUESTRUCT            ;
  417.         mov    ax, ( nIndex )                ;
  418.         mov    cx, size JOBSTRUCT            ;
  419.         mul    cx                    ;
  420.         add    bx, ax                    ;
  421.  
  422. ;---------------------------------------------------------------
  423. ; Complete the details in the JOBSTRUCT
  424. ;---------------------------------------------------------------
  425.  
  426.         mov    ax, ( nSpoolFileNumber )        ; JobID
  427.         mov    es: [ bx ].pjID, ax            ;
  428.  
  429.         mov    ax, ( pUserName )            ; UserName
  430.         mov    es: [ bx ].pjUserName, ax        ;
  431.  
  432.         mov    es: [ bx ].pjParameters, NULL        ; Parameters
  433.  
  434.         mov    ax, ( nIndex )                ; Position
  435.         inc    ax                    ; (plus 1)
  436.         mov    es: [ bx ].pjPosition, ax        ;
  437.  
  438.         mov    ax, ( nStatus )             ; Status
  439.         mov    es: [ bx ].pjStatus, ax         ;
  440.  
  441.         mov    ax, ( nTime )                ; Submitted
  442.         mov    word ptr es: [ bx ].pjSubmitted + 0, ax ;
  443.         mov    ax, ( nDate )                ;
  444.         mov    word ptr es: [ bx ].pjSubmitted + 2, ax ;
  445.  
  446.         mov    ax, word ptr ( lSize + 0 )        ; Size
  447.         mov    word ptr es: [ bx ].pjSize + 0, ax    ;
  448.         mov    ax, word ptr ( lSize + 2 )        ;
  449.         mov    word ptr es: [ bx ].pjSize + 2, ax    ;
  450.  
  451.         mov    es: [ bx ].pjCopies, 1            ; Copies
  452.  
  453.         mov    es: [ bx ].pjComment, NULL        ; Comment
  454.  
  455. ;---------------------------------------------------------------
  456. ; Loop for next entry
  457. ;---------------------------------------------------------------
  458.  
  459.         dec    ( nIndex )                ;
  460.         jmp    ConvertEntry                ;
  461.  
  462. ;---------------------------------------------------------------
  463. ; Return to the caller.
  464. ;---------------------------------------------------------------
  465.  
  466. LastEntryConverted:
  467.  
  468. cEnd
  469.  
  470. ;===============================================================================
  471. subttl        CompleteQueueStruct
  472. page
  473. ;===============================================================================
  474. ;
  475. ; DESCRIPTION .
  476. ; ENTRY .......
  477. ; EXIT ........
  478. ; COMMENTS ....
  479. ;
  480. ;===============================================================================
  481.  
  482. cProc        CompleteQueueStruct, <NEAR,PUBLIC>, <si, di>
  483.  
  484.         parmD    lpQueueStruct
  485.         parmW    nEntriesInTotal
  486. cBegin
  487.         les    bx, ( lpQueueStruct )
  488.         mov    cx, ( nEntriesInTotal )
  489.  
  490.         mov    es: [ bx ].pqName, NULL
  491.         mov    es: [ bx ].pqComment, NULL
  492.         mov    es: [ bx ].pqStatus, WNPRQ_ACTIVE
  493.         mov    es: [ bx ].pqJobCount, cx
  494.         mov    es: [ bx ].pqPrinters, 1
  495. cEnd
  496.  
  497. ;===============================================================================
  498. subttl        ReformatBuffer
  499. page
  500. ;===============================================================================
  501. ;
  502. ; DESCRIPTION .
  503. ; ENTRY .......
  504. ; EXIT ........
  505. ; COMMENTS ....
  506. ;
  507. ;===============================================================================
  508.  
  509. cProc        ReformatBuffer, <NEAR,PUBLIC>, <si, di, ds>
  510.  
  511.         parmD    lpqBuffer
  512.         parmW    nEntriesInBuffer
  513.         parmW    nEntriesInTotal
  514.  
  515.         localW    nIndex
  516.         localD    lpNameSpace
  517. cBegin
  518.  
  519. ;---------------------------------------------------------------
  520. ; Calculate where all the originators names will be stored.
  521. ; This will be at the end of the buffer after all the JOBSTRUCTS.
  522. ;---------------------------------------------------------------
  523.  
  524.         les    bx, ( lpqBuffer )
  525.         mov    ax, size JOBSTRUCT
  526.         mov    cx, ( nEntriesInBuffer )
  527.         mul    cx
  528.         add    ax, size QUEUESTRUCT
  529.         add    bx, ax
  530.  
  531.         mov    word ptr ( lpNameSpace + 0 ), bx
  532.         mov    word ptr ( lpNameSpace + 2 ), es
  533.  
  534. ;---------------------------------------------------------------
  535. ; Move all the originators names to their final resting place.
  536. ;---------------------------------------------------------------
  537.  
  538.         Arg    lpqBuffer
  539.         Arg    lpNameSpace
  540.         Arg    nEntriesInBuffer
  541.         cCall    MoveNamesDown
  542.  
  543. ;---------------------------------------------------------------
  544. ; Change all the SMB format entries to WinNet format entries.
  545. ;---------------------------------------------------------------
  546.  
  547.         Arg    lpqBuffer
  548.         Arg    lpNameSpace
  549.         Arg    nEntriesInBuffer
  550.         cCall    ConvertEntries
  551.  
  552. ;---------------------------------------------------------------
  553. ; Complete the QUEUESTRUCT at the head of the buffer.
  554. ;---------------------------------------------------------------
  555.  
  556.         Arg    lpqBuffer
  557.         Arg    nEntriesInBuffer
  558.         cCall    CompleteQueueStruct
  559.  
  560. ;---------------------------------------------------------------
  561. ; Return to the caller.
  562. ;---------------------------------------------------------------
  563.  
  564. cEnd
  565.  
  566. ;===============================================================================
  567. subttl        GetWholeQueue
  568. page
  569. ;===============================================================================
  570. ;
  571. ; DESCRIPTION .
  572. ; ENTRY .......
  573. ; EXIT ........
  574. ; COMMENTS ....
  575. ;
  576. ;===============================================================================
  577.  
  578. cProc        GetWholeQueue, <NEAR,PUBLIC>, <si, di>
  579.  
  580.         parmW    nSessionNumber
  581.         parmD    lpszUser
  582.         parmD    lpqBuffer
  583.         parmD    lpnEntriesReturned
  584.  
  585.         localW    nReturnCode
  586.         localW    nEntriesInBuffer
  587.         localW    nEntriesInTotal
  588. cBegin
  589.         mov    ( nReturnCode ), WN_SUCCESS
  590.  
  591. ;---------------------------------------------------------------
  592. ; Read the queue
  593. ;---------------------------------------------------------------
  594.  
  595.         mov    ax, 0
  596.         mov    cx, MSNET_MAX_PRINT_JOBS
  597.  
  598.         Arg    lpqBuffer                ; Pointer to buffer
  599.         Arg    ax                    ; Start index
  600.         Arg    cx                    ; Count
  601.         Arg    nSessionNumber                ; Session number
  602.         cCall    NETGetPrintQueue            ; Fill buffer
  603.  
  604.         cmp    ax, WN_SUCCESS
  605.         je    SaveEntryCount
  606.  
  607.         mov    ( nReturnCode ), ax
  608.         jmp    GetWholePrintQueueExit
  609.  
  610. SaveEntryCount: mov    ( nEntriesInBuffer ), cx
  611.         mov    ( nEntriesInTotal ), cx
  612.  
  613. ;---------------------------------------------------------------
  614. ; Convert the SMB format buffer into a WinNet format buffer.
  615. ;---------------------------------------------------------------
  616.  
  617.         Arg    lpqBuffer
  618.         Arg    nEntriesInBuffer
  619.         Arg    nEntriesInTotal
  620.         cCall    ReformatBuffer
  621.  
  622. ;---------------------------------------------------------------
  623. ; Return the number of entries in the buffer.
  624. ;---------------------------------------------------------------
  625.  
  626.         les    bx, ( lpnEntriesReturned )
  627.         mov    ax, ( nEntriesInBuffer )
  628.         mov    es: [ bx ], ax
  629.  
  630. ;---------------------------------------------------------------
  631. ; Return
  632. ;---------------------------------------------------------------
  633.  
  634. GetWholePrintQueueExit:
  635.  
  636.         mov    ax, ( nReturnCode )
  637. cEnd
  638.  
  639. ;===============================================================================
  640. ; ============= END OF MSNETPRN ================================================
  641. ;===============================================================================
  642.  
  643. sEnd        PRNCODE
  644.         end
  645.