S" INCLUDE\FACIL.F" INCLUDED
S" SAMPLES\SOCKETS.TXT" INCLUDED
S" SAMPLES\THREAD.TXT" INCLUDED
S" EXT\MUTEX.F"          INCLUDED
DECIMAL

' ANSI>OEM TO ANSI><OEM
\ --------------------------------------------------------------------------
WINAPI: SetClassLongA           USER32.DLL
WINAPI: MessageBoxA             USER32.DLL
WINAPI: DialogBoxIndirectParamA USER32.DLL
WINAPI: EndDialog               USER32.DLL
WINAPI: SetDlgItemTextA         USER32.DLL
WINAPI: GetDlgItem              USER32.DLL
WINAPI: GetDlgCtrlID            USER32.DLL
WINAPI: SendMessageA            USER32.DLL
WINAPI: SetWindowTextA          USER32.DLL
WINAPI: InitCommonControls      COMCTL32.DLL
WINAPI: LoadImageA              USER32.DLL
WINAPI: ImageList_Create        COMCTL32.DLL
WINAPI: ImageList_AddIcon       COMCTL32.DLL
WINAPI: CreateToolbarEx         COMCTL32.DLL
WINAPI: FreeConsole             KERNEL32.DLL
WINAPI: CheckDlgButton          USER32.DLL
WINAPI: IsDlgButtonChecked      USER32.DLL

\ -----------------------

: #define
  CREATE 0 0 BL WORD COUNT
  >NUMBER DUP IF 1- SWAP 1+ SWAP >NUMBER THEN 2DROP D>S ,
  DOES> @
;
HEX
IMAGE-BASE CONSTANT HINST  \ Instance  
       0 CONSTANT HCON     \ hwnd   

\  
  CF0000 CONSTANT WS_OVERLAPPEDWINDOW
10000000 CONSTANT WS_VISIBLE
80000000 CONSTANT WS_POPUP
  800000 CONSTANT WS_BORDER
40000000 CONSTANT WS_CHILD
00C00000 CONSTANT WS_CAPTION
00080000 CONSTANT WS_SYSMENU
00010000 CONSTANT WS_TABSTOP
00020000 CONSTANT WS_GROUP
00040000 CONSTANT WS_SIZEBOX
00100000 CONSTANT WS_HSCROLL
00200000 CONSTANT WS_VSCROLL
      80 CONSTANT DS_MODALFRAME
      40 CONSTANT DS_SETFONT
      80 CONSTANT ES_AUTOHSCROLL
      40 CONSTANT ES_AUTOVSCROLL
    0001 CONSTANT ES_CENTER
    0000 CONSTANT ES_LEFT
    0004 CONSTANT ES_MULTILINE
    0800 CONSTANT ES_READONLY
    0002 CONSTANT ES_RIGHT
    1000 CONSTANT ES_WANTRETURN
    0002 CONSTANT CBS_DROPDOWN
    0040 CONSTANT CBS_AUTOHSCROLL

\ messages
     111 CONSTANT WM_COMMAND
     110 CONSTANT WM_INITDIALOG
    004E CONSTANT WM_NOTIFY
      0F CONSTANT WM_PAINT
#define WM_CONTEXTMENU                  0x007B
#define WM_SETTEXT                      0x000C
#define WM_GETTEXT                      0x000D
#define WM_CLEAR                        0x0303


0 CONSTANT NM_FIRST
-1 CONSTANT NM_OUTOFMEMORY          ( NM_FIRST-1)
-2 CONSTANT NM_CLICK                ( NM_FIRST-2)
-3 CONSTANT NM_DBLCLK               ( NM_FIRST-3)
-4 CONSTANT NM_RETURN               ( NM_FIRST-4)
-5 CONSTANT NM_RCLICK               ( NM_FIRST-5)
-6 CONSTANT NM_RDBLCLK              ( NM_FIRST-6)
-7 CONSTANT NM_SETFOCUS             ( NM_FIRST-7)
-8 CONSTANT NM_KILLFOCUS            ( NM_FIRST-8)

\ -----------
#define MB_ICONEXCLAMATION          0x00000030
       1 CONSTANT IDOK
       2 CONSTANT IDCANCEL
0080 CONSTANT DI_Button 
0081 CONSTANT DI_Edit 
0082 CONSTANT DI_Static 
0083 CONSTANT DI_Listbox 
0084 CONSTANT DI_Scrollbar 
0085 CONSTANT DI_Combobox

        0010 CONSTANT LR_LOADFROMFILE
#define LR_LOADTRANSPARENT  0x0020
        0080 CONSTANT LR_LOADREALSIZE

           0 CONSTANT IMAGE_BITMAP
           1 CONSTANT IMAGE_ICON
           1 CONSTANT ILC_MASK

#define DS_3DLOOK           0x0004
#define DS_FIXEDSYS         0x0008
#define DS_NOFAILCREATE     0x0010
#define DS_CONTROL          0x0400
#define DS_CENTER           0x0800
#define DS_CENTERMOUSE      0x1000
#define DS_CONTEXTHELP      0x2000
#define WS_MINIMIZEBOX      0x00020000
#define WS_MAXIMIZEBOX      0x00010000

1000 CONSTANT LVM_FIRST
1100 CONSTANT TV_FIRST

        0001 CONSTANT TVS_HASBUTTONS
        0004 CONSTANT TVS_LINESATROOT
        0002 CONSTANT TVS_HASLINES
#define LVS_ICON                0x0000
#define LVS_REPORT              0x0001
#define LVS_SMALLICON           0x0002
#define LVS_LIST                0x0003
#define LVS_TYPEMASK            0x0003
#define LVS_SINGLESEL           0x0004
#define LVS_SHOWSELALWAYS       0x0008
#define LVS_SORTASCENDING       0x0010
#define LVS_SORTDESCENDING      0x0020
#define LVS_SHAREIMAGELISTS     0x0040
#define LVS_NOLABELWRAP         0x0080
#define LVS_AUTOARRANGE         0x0100
#define LVS_EDITLABELS          0x0200
#define LVS_NOSCROLL            0x2000

#define LVCF_FMT                0x0001
#define LVCF_WIDTH              0x0002
#define LVCF_TEXT               0x0004
#define LVCF_SUBITEM            0x0008

#define LVCFMT_LEFT             0x0000
#define LVCFMT_RIGHT            0x0001
#define LVCFMT_CENTER           0x0002
#define LVCFMT_JUSTIFYMASK      0x0003

#define LVIF_TEXT               0x0001
#define LVIF_IMAGE              0x0002
#define LVIF_PARAM              0x0004
#define LVIF_STATE              0x0008

#define LVSIL_NORMAL            0
#define LVSIL_SMALL             1
#define LVSIL_STATE             2

#define TVIS_EXPANDEDONCE       0x0040

#define EM_GETSEL               0x00B0
#define EM_SETSEL               0x00B1
#define EM_GETRECT              0x00B2
#define EM_SETRECT              0x00B3
#define EM_SETRECTNP            0x00B4
#define EM_SCROLL               0x00B5
#define EM_LINESCROLL           0x00B6
#define EM_SCROLLCARET          0x00B7
#define EM_GETMODIFY            0x00B8
#define EM_SETMODIFY            0x00B9
#define EM_GETLINECOUNT         0x00BA
#define EM_LINEINDEX            0x00BB
#define EM_SETHANDLE            0x00BC
#define EM_GETHANDLE            0x00BD
#define EM_GETTHUMB             0x00BE
#define EM_LINELENGTH           0x00C1
#define EM_REPLACESEL           0x00C2
#define EM_GETLINE              0x00C4
#define EM_LIMITTEXT            0x00C5
#define EM_CANUNDO              0x00C6
#define EM_UNDO                 0x00C7
#define EM_FMTLINES             0x00C8
#define EM_LINEFROMCHAR         0x00C9
#define EM_SETTABSTOPS          0x00CB
#define EM_SETPASSWORDCHAR      0x00CC
#define EM_EMPTYUNDOBUFFER      0x00CD
#define EM_GETFIRSTVISIBLELINE  0x00CE
#define EM_SETREADONLY          0x00CF
#define EM_SETWORDBREAKPROC     0x00D0
#define EM_GETWORDBREAKPROC     0x00D1
#define EM_GETPASSWORDCHAR      0x00D2
#define EM_SETMARGINS           0x00D3
#define EM_GETMARGINS           0x00D4
#define EM_SETLIMITTEXT         0x00C5
#define EM_GETLIMITTEXT         0x00D5
#define EM_POSFROMCHAR          0x00D6
#define EM_CHARFROMPOS          0x00D7

#define TBSTATE_CHECKED         0x01
#define TBSTATE_PRESSED         0x02
#define TBSTATE_ENABLED         0x04
#define TBSTATE_HIDDEN          0x08
#define TBSTATE_INDETERMINATE   0x10
#define TBSTATE_WRAP            0x20

#define TBSTYLE_BUTTON          0x00
#define TBSTYLE_SEP             0x01
#define TBSTYLE_CHECK           0x02
#define TBSTYLE_GROUP           0x04

#define TBSTYLE_TOOLTIPS        0x0100
#define TBSTYLE_WRAPABLE        0x0200
#define TBSTYLE_ALTDRAG         0x0400

#define TVGN_CARET              0x0009

#define TVE_COLLAPSE            0x0001
#define TVE_EXPAND              0x0002
#define TVE_TOGGLE              0x0003
#define TVE_COLLAPSERESET       0x8000

#define BS_AUTOCHECKBOX     0x00000003L

#define CB_ADDSTRING                0x0143
#define CB_FINDSTRINGEXACT          0x0158
#define CB_SETCURSEL                0x014E
#define CB_GETCOUNT                 0x0146
#define CB_GETLBTEXT                0x0148

-1 CONSTANT CB_ERR


FFFF0000 CONSTANT TVI_ROOT
FFFF0001 CONSTANT TVI_FIRST
FFFF0002 CONSTANT TVI_LAST
FFFF0003 CONSTANT TVI_SORT
        0001 CONSTANT TVIF_TEXT
        0002 CONSTANT TVIF_IMAGE
        0004 CONSTANT TVIF_PARAM
        0008 CONSTANT TVIF_STATE
        0010 CONSTANT TVIF_HANDLE
        0020 CONSTANT TVIF_SELECTEDIMAGE
        0040 CONSTANT TVIF_CHILDREN

\ --------------------------------------------------------
\ *******       
0
4 -- DLGTEMPLATE.style
4 -- DLGTEMPLATE.dwExtendedStyle
2 -- DLGTEMPLATE.cdit
2 -- DLGTEMPLATE.x
2 -- DLGTEMPLATE.y
2 -- DLGTEMPLATE.cx
2 -- DLGTEMPLATE.cy
CONSTANT /DLGTEMPLATE

0
4 -- DLGITEMTEMPLATE.style
4 -- DLGITEMTEMPLATE.dwExtendedStyle
2 -- DLGITEMTEMPLATE.x
2 -- DLGITEMTEMPLATE.y
2 -- DLGITEMTEMPLATE.cx
2 -- DLGITEMTEMPLATE.cy
2 -- DLGITEMTEMPLATE.id
CONSTANT /DLGITEMTEMPLATE

: DIALOG: ( x y cx cy cdit style "name" -- )
  CREATE HERE 0 ,
  HERE 7 + 8 / 8 * HERE - ALLOT
  HERE SWAP !
  HERE DUP >R /DLGTEMPLATE DUP ALLOT ERASE
\  [ HEX ] 10501 [ DECIMAL ] R@ DLGTEMPLATE.dwExtendedStyle !
  R@ DLGTEMPLATE.style !
  R@ DLGTEMPLATE.cdit W!
  R@ DLGTEMPLATE.cy W!
  R@ DLGTEMPLATE.cx W!
  R@ DLGTEMPLATE.y W!
  R> DLGTEMPLATE.x W!
  0 W, \ menu  (no menu)
  0 W, \ class (def)
\  0 W, \ title (no title)
\  8 W,
;

: L" ( "ccc" -- ) \ *******    UNICODE
  [CHAR] " PARSE \ DUP >R
  0 ?DO DUP I + C@ W, LOOP DROP 0 W,
\  R> 2 MOD 0 = IF 0 W, THEN
;
: DIALOGITEM ( x y cx cy id style class -- ) \ *******  
  >R
  HERE DUP >R /DLGITEMTEMPLATE DUP ALLOT ERASE
  R@ DLGITEMTEMPLATE.style !
  R@ DLGITEMTEMPLATE.id W!
  R@ DLGITEMTEMPLATE.cy W!
  R@ DLGITEMTEMPLATE.cx W!
  R@ DLGITEMTEMPLATE.y W!
  R> DLGITEMTEMPLATE.x W!
  -1 W, R> W, \ class
  0 W,             \ title (initial text)
  0 ,             \ creation data
;
\ -----------------    ------------------------------
DECIMAL
0
1 + DUP 200 + CONSTANT 
1 + DUP 200 + CONSTANT 
\ 1 + DUP CONSTANT 0
1 + DUP CONSTANT Combo1
1 + DUP CONSTANT Combo2
1 + DUP CONSTANT 
1 + DUP CONSTANT 2
1 + DUP CONSTANT 
1 + DUP CONSTANT 
\ 1 + DUP CONSTANT 
CONSTANT 

0 0 400 255 
 DS_MODALFRAME  WS_POPUP OR  WS_VISIBLE OR
 WS_CAPTION OR  WS_SYSMENU OR
 DS_SETFONT OR 
 DS_CENTER OR
 WS_MINIMIZEBOX OR

DIALOG: DLG
L" HTTP-resume v1.02b" 8 W,
L" MS Sans Serif" 0 W,  (  204 W,)

350 18 50 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR
DI_Button DIALOGITEM

350 3 50 14 
WS_VISIBLE WS_CHILD OR WS_TABSTOP OR
DI_Button DIALOGITEM

\ 165 199 50 14 0
\ WS_VISIBLE WS_CHILD OR WS_BORDER OR
\ DI_Static DIALOGITEM

\ 215 199 192 14 0
\ ES_MULTILINE ES_AUTOVSCROLL OR  ES_WANTRETURN OR
\ WS_VSCROLL OR
\ WS_VISIBLE OR  WS_CHILD OR WS_BORDER OR WS_TABSTOP OR
\ DI_Edit DIALOGITEM

0 18 24 13 
WS_VISIBLE WS_CHILD OR WS_BORDER OR
DI_Static DIALOGITEM

0 3 24 13 2
WS_VISIBLE WS_CHILD OR WS_BORDER OR
DI_Static DIALOGITEM

0 24 +  18  348 24 -  200 Combo1
WS_VISIBLE WS_CHILD OR ( WS_BORDER OR) WS_TABSTOP OR
CBS_DROPDOWN OR WS_VSCROLL OR CBS_AUTOHSCROLL OR
DI_Combobox DIALOGITEM

0 24 +  3  348 24 -  200 Combo2
WS_VISIBLE WS_CHILD OR ( WS_BORDER OR) WS_TABSTOP OR
CBS_DROPDOWN OR WS_VSCROLL OR CBS_AUTOHSCROLL OR
DI_Combobox DIALOGITEM

0 34 400 208 
ES_MULTILINE ES_AUTOVSCROLL OR ES_AUTOHSCROLL OR ES_WANTRETURN OR
WS_VSCROLL OR WS_HSCROLL OR
WS_VISIBLE OR WS_CHILD OR WS_BORDER OR WS_TABSTOP OR
DI_Edit DIALOGITEM
-10 ALLOT
L" RICHEDIT"
0 ,

0 240 348 14 
WS_VISIBLE WS_CHILD OR WS_BORDER OR
DI_Static DIALOGITEM
-10 ALLOT
L" msctls_statusbar32"
0 ,

\ 225 240 65 14 
\ WS_VISIBLE WS_CHILD OR WS_TABSTOP OR BS_AUTOCHECKBOX OR
\ DI_Button DIALOGITEM

\ ---------------------------  
0 VALUE 
0 VALUE 

:  ( id -- hwnd )
   GetDlgItem 
;
: ID ( hwnd -- id )
  GetDlgCtrlID
;
:  ( lparam wparam msg id -- lresult )
   SendMessageA
;
\ ----------  Notification Messages ------
0
4 -- NMHDR.hwndFrom
4 -- NMHDR.idFrom
4 -- NMHDR.code
CONSTANT /NMHDR

0
4 -- POINT.x
4 -- POINT.y
CONSTANT /POINT

0
/NMHDR -- LV_KEYDOWN.hdr
     2 -- LV_KEYDOWN.wVKey
     4 -- LV_KEYDOWN.flags
CONSTANT /LV_KEYDOWN


\ ---------------------------------------------------------------------------

HEX
#define OFN_NOCHANGEDIR              0x00000008
#define OFN_CREATEPROMPT             0x00002000
#define OFN_EXPLORER                 0x00080000
DECIMAL

0
4 -- OF.lStructSize
4 -- OF.hwndOwner
4 -- OF.hInstance
4 -- OF.lpstrFilter
4 -- OF.lpstrCustomFilter
4 -- OF.nMaxCustFilter
4 -- OF.nFilterIndex
4 -- OF.lpstrFile
4 -- OF.nMaxFile
4 -- OF.lpstrFileTitle
4 -- OF.nMaxFileTitle
4 -- OF.lpstrInitialDir
4 -- OF.lpstrTitle
4 -- OF.Flags
2 -- OF.nFileOffset
2 -- OF.nFileExtension
4 -- OF.lpstrDefExt
4 -- OF.lCustData
4 -- OF.lpfnHook
4 -- OF.lpTemplateName
CONSTANT /OPENFILENAME
 
: S, ( addr u -- )
  HERE SWAP DUP ALLOT MOVE
;
CREATE O.F HERE /OPENFILENAME DUP ALLOT ERASE
/OPENFILENAME O.F OF.lStructSize !
HERE O.F OF.lpstrFilter !
S"   (*.*)" S, 0 C, S" *.*" S, 0 W,
1 O.F OF.nFilterIndex !
OFN_CREATEPROMPT OFN_EXPLORER OR OFN_NOCHANGEDIR OR O.F OF.Flags !

WINAPI: GetOpenFileNameA COMDLG32.DLL
:  ( -- flag )
  HERE O.F OF.lpstrFile ! HERE 0!
  500 O.F OF.nMaxFile ! O.F GetOpenFileNameA
;
\ ---------------------------------------------------------------------------
:  ( addr u id -- )
  \           
  >R
  DROP 1 EM_REPLACESEL R>  DROP
;
:  ( id -- )
  >R 0 1 EM_SETREADONLY R>  DROP
;
:  ( id -- )
  >R 0 0 EM_SETREADONLY R>  DROP
;
\ ---------------------------------------------------------------------------

\ --------------------------------------------------------

:  ( c-addr u id -- )
  >R 2DUP + 0 SWAP C! R>
  NIP  SetDlgItemTextA DROP
;
:  ( c-addr u id -- )
  >R
  R/O OPEN-FILE THROW >R
  HERE 10000 R@ READ-FILE THROW HERE + 0!
  R> CLOSE-FILE THROW
  HERE 10000 R> 
;
: 
  2DUP + 0 SWAP C!
  DROP  SetWindowTextA DROP
;

\    Windows    CASE-

VOCABULARY Windows

: M: ( "WM_..." -- )
  \   
  BASE @ >R HEX
  ' EXECUTE 0 <# [CHAR] m HOLD # # # #  # # # # BL HOLD [CHAR] : HOLD #>
  EVALUATE
  R> BASE !
;
: C:
  BASE @ >R HEX
  ' EXECUTE 0 <# #S [CHAR] c HOLD BL HOLD [CHAR] : HOLD #>
  EVALUATE
  R> BASE !
;
:  ( lparam wparam uint=msg hwnd wid -- TRUE | -"- FALSE )
  \     
  100 ALLOT
  >R
  BASE @ >R HEX
  OVER 0 <# [CHAR] m HOLD # # # #  # # # # #>
  R> BASE !
  -100 ALLOT
  R> SEARCH-WORDLIST
  IF EXECUTE  ELSE FALSE THEN
;
VARIABLE 
: 
  DROP
  MB_ICONEXCLAMATION S" " DROP
  ROT  MessageBoxA DROP
;
:  ( ERRNO -- )
  >R S"         "
  OVER 24 + DUP 4 BL FILL
  R> 0
  BASE @ >R HEX <# # # # # #> R> BASE !
  ROT SWAP MOVE
  
;
: LOAD-ICON16 ( c-addr u -- hicon ) \      *.ico
  DROP >R
  LR_LOADFROMFILE 16 16 IMAGE_ICON R> 0 LoadImageA
;
\ --------------------------------------------------------


1 VALUE HTTP1?

CREATE CRLFCRLF 13 C, 10 C, 13 C, 10 C, 0 C,
VARIABLE ISTEXT
VARIABLE RANGE
VARIABLE BTIME
VARIABLE SIZE
VARIABLE STOP

: TIME ( - N )
  TIME&DATE 2DROP DROP 3600 * SWAP 60 * + +
;
: BPS
\  100 ALLOT
  SIZE @ TIME BTIME @ - 1 MAX / 0 <# [CHAR] s HOLD [CHAR] p HOLD [CHAR] b HOLD BL HOLD #S #>
   
  SIZE @ 0 <# #S #> 
\  -100 ALLOT
;
: OPEN/CREATE-FILE ( c-addr u fam -- fileid ior )
  >R 2DUP R@ OPEN-FILE
  IF DROP R> CREATE-FILE
  ELSE R> DROP >R 2DROP R> 0 THEN
;
: log
\  . SPACE . SPACE
  TYPE SPACE \ TlsIndex@ . CR
;
: LOG ( STRING FILE -- )
  S" ESERVLOG" FALSE CREATE-MUTEX IF DROP 2DROP 2DROP EXIT THEN
  DUP >R
  -1 SWAP WAIT NIP IF 2DROP 2DROP EXIT THEN
  H-STDOUT >R R/W OPEN/CREATE-FILE DROP TO H-STDOUT
  H-STDOUT FILE-SIZE DROP
  H-STDOUT REPOSITION-FILE DROP
  ['] log CATCH IF 2DROP THEN
  H-STDOUT CLOSE-FILE DROP
  R> TO H-STDOUT
  R> RELEASE-MUTEX DROP
;
: L ( addr u -- )
  S" Http-res.log" LOG
;
: Get1 \    HTTP-
( addr u S" www.enet.ru" 80 S" \win\cherezov\index.html" -- )
  CRLFCRLF 2 L
  S" Finding..."  
  2>R >R 2DUP L GetHostIP THROW
  R> CreateSocket THROW DUP >R
  ConnectSocket THROW S" Connected" L
\  0 0 WM_CLEAR   DROP
  S" "  
  S" GET " R@ WriteSocket THROW
  R> 2R> OVER [CHAR] / SWAP C! 2DUP L
  ROT >R R@ WriteSocket THROW
  HTTP1? IF
    S"  HTTP/1.0" R@ WriteSocketLine THROW
    S" Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"
    R@ WriteSocketLine THROW
    S" Accept-Language: ru" R@ WriteSocketLine THROW
    RANGE @ IF
      S" Range: bytes=" R@ WriteSocket THROW
      RANGE @ 0 <# [CHAR] - HOLD #S #>
      R@ WriteSocketLine THROW RANGE 0!
\      S" 100000000" R@ WriteSocketLine THROW RANGE 0!
    THEN
  THEN
  R@ WriteSocketCRLF THROW S" GET" L
  TIME BTIME ! SIZE 0! STOP 0! ISTEXT 0!
  S" Connected..."  
  ( addr u )
  BEGIN
   2DUP R@ ReadSocket THROW DUP SIZE +!
   >R
   OVER 9 + 3 S" 200" COMPARE 0= IF 0 0 H-STDOUT RESIZE-FILE DROP THEN
   OVER R@ S" Content-Type: text/" SEARCH NIP NIP ISTEXT !
   OVER R@ S" Content-type: text/" SEARCH NIP NIP ISTEXT @ OR ISTEXT !
   OVER R@ CRLFCRLF 4 SEARCH
   IF DROP ( addr u addr2 R: len0 )
      4 + >R ( addr u    R: len0 addr3 )
      OVER R@ OVER ( addr u addr addr3 addr )
      - DUP >R  ( addr u addr len   R: len0 addr3 len )
      DUP NEGATE SIZE +! ( -"- )
      OVER + 4 - 0! 0 EM_REPLACESEL   DROP
      CRLFCRLF 0 EM_REPLACESEL   DROP
      ( addr u )
      R> R> SWAP ( addr u addr3 len )
      R> SWAP - ( addr u addr3 len0-len )
\      ISTEXT 0!
      ISTEXT @ IF OVER + 0! 0 EM_REPLACESEL   DROP
               ELSE TYPE THEN TRUE ( addr u TRUE )
   ELSE NEGATE SIZE +!  R> 2DROP FALSE THEN
  UNTIL S" Head loaded" L
  BPS
  BEGIN
    2DUP R@ ReadSocket DUP -1002 = IF DROP ELSE THROW THEN
    DUP SIZE +! ?DUP
    BPS STOP @ 0= AND
  WHILE
    >R OVER R>
      ISTEXT @ IF OVER + 0! 0 EM_REPLACESEL   DROP
               ELSE TYPE THEN
  REPEAT 2DROP S" End" L
  R> CloseSocket THROW H-STDOUT CLOSE-FILE THROW S" Closed" L
  STOP @ IF S" USER BREAK" DROP 0 EM_REPLACESEL   DROP THEN
;
VARIABLE WORKING
: (GET) ( " www.enet.ru /win/cherezov/index.html" -- )
  INIT-THREAD HERE 10000 ALLOT SP@ S0 !
  TRUE WORKING !
  10000 BL SKIP [CHAR] / PARSE 2DUP + 0 SWAP C! 80
  >IN @ 1- 0 MAX >IN ! BL PARSE 2DUP + 0 SWAP C! ['] Get1 CATCH
  ?DUP IF 0 <# #S [CHAR] R HOLD [CHAR] R HOLD [CHAR] E HOLD #>
           
       ELSE S" Ready"   THEN
  H-STDOUT CLOSE-FILE DROP
  FALSE WORKING !
  0 ExitThread
;
' (GET) WNDPROC: GET

: HTTP-RES
  WORKING @ IF 0 S"     " DROP
               S" HTTP-RES" DROP SWAP 0 MessageBoxA DROP EXIT THEN
  502 ALLOCATE THROW TO TIB 500 TO C/L SOURCE ERASE
  TIB C/L WM_GETTEXT Combo1  #TIB ! >IN 0!
  TIB -1 CB_FINDSTRINGEXACT Combo1  CB_ERR =
  IF SOURCE CB_ADDSTRING Combo1  DROP THEN
  
  502 ALLOCATE THROW DUP >R 502 ERASE
  R@ 500 WM_GETTEXT Combo2 
  R@ -1 CB_FINDSTRINGEXACT Combo2  CB_ERR =
  IF R@ OVER CB_ADDSTRING Combo2  DROP THEN
  R> SWAP R/W OPEN/CREATE-FILE
  IF DROP S"      !" DROP
     0 EM_REPLACESEL   DROP EXIT
  ELSE TO H-STDOUT THEN
  H-STDOUT FILE-SIZE THROW OVER RANGE ! H-STDOUT REPOSITION-FILE THROW
  TRUE WORKING !
  ['] GET CREATE-THREAD DROP 1000000 0 DO NOOP LOOP 
\  GET
;
\ ---------------------------------------------------------------------------------
\   

ALSO Windows DEFINITIONS
\ 0 GET-CURRENT CLASS!

C: IDCANCEL
   502 ALLOCATE THROW TO TIB 500 TO C/L SOURCE ERASE
   S" Http-res.ini" R/W CREATE-FILE THROW TO H-STDOUT
   0 0 CB_GETCOUNT Combo1  0 ?DO
     TIB I CB_GETLBTEXT Combo1  #TIB ! >IN 0!
     SOURCE TYPE CR
   LOOP H-STDOUT CLOSE-FILE DROP
    EndDialog ( true ) DROP
;
C: IDOK
\   ['] CATCH HTTP-RES
\  ?DUP IF 0 <# #S [CHAR] R HOLD [CHAR] R HOLD [CHAR] E HOLD #>
\           
\       THEN
  HTTP-RES
;
C: 
\   ['] CATCH HTTP-RES
\  ?DUP IF 0 <# #S [CHAR] R HOLD [CHAR] R HOLD [CHAR] E HOLD #>
\           
\       THEN
  HTTP-RES
;
C: 
   TRUE STOP !
;
\ M: WM_SETTEXT
\    2DROP 2DROP FALSE
\ ;
M: WM_COMMAND ( lparam wparam uint=msg hwnd -- TRUE )
   DUP TO 
   BASE @ >R HEX 2>R
\   ." WM_COMMAND: WPARAM: " DUP 0 <# # # # # [CHAR] . HOLD # # # # #> TYPE CR
   DUP 0 <# #S [CHAR] c HOLD #> ALSO Windows CONTEXT @ PREVIOUS
   SEARCH-WORDLIST
   IF >R 2DROP R> 2R> 2DROP R> BASE ! EXECUTE TRUE
   ELSE 2R> R> BASE ! FALSE THEN
;

M: WM_NOTIFY ( lparam wparam uint=msg hwnd -- TRUE )
   DUP TO 
   >R 2>R DUP
   DUP NMHDR.idFrom @ TO 
       NMHDR.code @ 
       BASE @ >R HEX
       0 <# [CHAR] m HOLD # # # #  # # # # #>
       R> BASE !
       ALSO Windows CONTEXT @ PREVIOUS
       SEARCH-WORDLIST
       IF 2R> 2DROP ( DROP msg&wparam)
          R> DROP ( DROP hwnd )
         ( lparam xt ) EXECUTE 1
       ELSE 2R> R> FALSE THEN
;

M: WM_INITDIALOG ( lparam wparam uint=msg hwnd -- TRUE )
   TO  DROP 2DROP

   S" HTTP-RES.TXT"                  
   S" Download"                           
   S" Stop"                           
   S" HTTP-RES.ICO" LOAD-ICON16 -14  SetClassLongA DROP
   S" HTTP-RES.INI" R/O OPEN-FILE
   IF DROP ELSE >R
   BEGIN
     HERE 500 ERASE
     HERE 500 R@ READ-LINE THROW
   WHILE
     HERE + 0!
     HERE 0 CB_ADDSTRING Combo1  DROP
   REPEAT R> CLOSE-FILE THROW
   THEN

   0 0 CB_SETCURSEL Combo1  DROP
\   S" HTTP-resume v1.0b   " 
   S" http://"  
   S" filename" Combo2 
   S" file:" 2 
   S" Ready"  

   TRUE
;
PREVIOUS DEFINITIONS
\ ---------------------------------------------------------------------

: (DlgWndProc)     ( lparam wparam uint hwnd -- flag )
  \   
  DUP TO 
  S0 @ >R SP@ 4 CELLS + S0 !
  OVER DROP
  ALSO Windows CONTEXT @ PREVIOUS
  ( ['])  0 \ CATCH ?DUP

  IF 
     DROP 2DROP 2DROP 0
  ELSE IF 1 ELSE 2DROP 2DROP 0 THEN THEN
  R> S0 !
;
' (DlgWndProc) WNDPROC: DlgWndProc

: T
\  FreeConsole DROP
  SocketsStartup THROW
  InitCommonControls DROP
  S" RICHED32.DLL" DROP LoadLibraryA DROP
  0 ['] DlgWndProc 0 DLG @ HINST DialogBoxIndirectParamA DROP
  SocketsCleanup THROW
  BYE
;
' NOOP TO ANSI><OEM
TRUE TO ?GUI FALSE TO ?CONSOLE ' T DUP MAINX ! TO <MAIN> S" Http-res.exe" SAVE
