; =================================================
;  Пример простого GUI приложения с использованием
;             библиотеки BASE64.LIB
; =================================================

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

include lib\base64.inc
includelib lib\base64.lib

; Определение дочерних контролов из RC
; ------------------------------------
IDE_TXT   EQU 201
IDB_B64   EQU 202
IDB_ASCII EQU 203
IDB_EXIT  EQU 204

DlgProc   PROTO :DWORD,:DWORD,:DWORD,:DWORD

.DATA?
; Буферы для преобразования
; -------------------------
MAX_B64   EQU 260
MAX_ASCII EQU MAX_B64 * 2 / 3
buffer1   db MAX_B64 dup (?)
buffer2   db MAX_ASCII dup (?)

.CODE
start:
     invoke GetModuleHandle,0
     invoke DialogBoxParam,eax,200,0,OFFSET DlgProc,0
     invoke ExitProcess,0

DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
     mov eax,uMsg
     .IF eax == WM_COMMAND
         mov eax,wParam
         cmp ax,IDB_EXIT
         je @exit
         .IF ax == IDB_ASCII

             ; Сконвертировать в ASCII
             ; -----------------------
             invoke GetDlgItemText,hWnd,IDE_TXT,OFFSET buffer1,MAX_B64
             test eax,eax
             jz @R
             invoke b64_decode,OFFSET buffer1,OFFSET buffer2
             invoke SetDlgItemText,hWnd,IDE_TXT,OFFSET buffer2

         .ELSEIF ax == IDB_B64

             ; Сконвертировать в Base64
             ; ------------------------
             invoke GetDlgItemText,hWnd,IDE_TXT,OFFSET buffer2,MAX_ASCII
             test eax,eax
             jz @R
             invoke b64_encode,OFFSET buffer2,OFFSET buffer1
             invoke SetDlgItemText,hWnd,IDE_TXT,OFFSET buffer1

         .ENDIF
     .ELSEIF eax == WM_CLOSE
@exit:   invoke EndDialog,hWnd,0
     .ENDIF
@R:  xor eax,eax
     ret
DlgProc ENDP

END start