diff --git a/extra/windows/com/syntax/syntax.factor b/extra/windows/com/syntax/syntax.factor index 5921235638..b3c803be2d 100755 --- a/extra/windows/com/syntax/syntax.factor +++ b/extra/windows/com/syntax/syntax.factor @@ -1,92 +1,92 @@ -USING: alien alien.c-types kernel windows.ole32 combinators.lib -parser splitting sequences.lib sequences namespaces assocs -quotations shuffle accessors words macros alien.syntax fry ; -IN: windows.com.syntax - - com-interface-definition - -TUPLE: com-function-definition name return parameters ; -C: com-function-definition - -SYMBOL: +com-interface-definitions+ -+com-interface-definitions+ get-global -[ H{ } +com-interface-definitions+ set-global ] -unless - -: find-com-interface-definition ( name -- definition ) - dup "f" = [ drop f ] [ - dup +com-interface-definitions+ get-global at* - [ nip ] - [ swap " COM interface hasn't been defined" append throw ] - if - ] if ; - -: save-com-interface-definition ( definition -- ) - dup name>> +com-interface-definitions+ get-global set-at ; - -: (parse-com-function) ( tokens -- definition ) - [ second ] - [ first ] - [ 3 tail 2 group [ first ] map "void*" prefix ] - tri - ; - -: parse-com-functions ( -- functions ) - ";" parse-tokens { ")" } split - [ empty? not ] filter - [ (parse-com-function) ] map ; - -: (iid-word) ( definition -- word ) - name>> "-iid" append create-in ; - -: (function-word) ( function interface -- word ) - name>> "::" rot name>> 3append create-in ; - -: family-tree ( definition -- definitions ) - dup parent>> [ family-tree ] [ { } ] if* - swap add ; - -: family-tree-functions ( definition -- functions ) - dup parent>> [ family-tree-functions ] [ { } ] if* - swap functions>> append ; - -: (define-word-for-function) ( function interface n -- ) - -rot [ (function-word) swap ] 2keep drop - { return>> parameters>> } get-slots - [ com-invoke ] 3curry - define ; - -: define-words-for-com-interface ( definition -- ) - [ [ (iid-word) ] [ iid>> 1quotation ] bi define ] - [ name>> "com-interface" swap typedef ] - [ - dup family-tree-functions - [ (define-word-for-function) ] with each-index - ] - tri ; - -PRIVATE> - -: COM-INTERFACE: - scan - scan find-com-interface-definition - scan string>guid - parse-com-functions - - dup save-com-interface-definition - define-words-for-com-interface - ; parsing - +USING: alien alien.c-types kernel windows.ole32 combinators.lib +parser splitting sequences.lib sequences namespaces assocs +quotations shuffle accessors words macros alien.syntax fry ; +IN: windows.com.syntax + + com-interface-definition + +TUPLE: com-function-definition name return parameters ; +C: com-function-definition + +SYMBOL: +com-interface-definitions+ ++com-interface-definitions+ get-global +[ H{ } +com-interface-definitions+ set-global ] +unless + +: find-com-interface-definition ( name -- definition ) + dup "f" = [ drop f ] [ + dup +com-interface-definitions+ get-global at* + [ nip ] + [ swap " COM interface hasn't been defined" append throw ] + if + ] if ; + +: save-com-interface-definition ( definition -- ) + dup name>> +com-interface-definitions+ get-global set-at ; + +: (parse-com-function) ( tokens -- definition ) + [ second ] + [ first ] + [ 3 tail 2 group [ first ] map "void*" prefix ] + tri + ; + +: parse-com-functions ( -- functions ) + ";" parse-tokens { ")" } split + [ empty? not ] filter + [ (parse-com-function) ] map ; + +: (iid-word) ( definition -- word ) + name>> "-iid" append create-in ; + +: (function-word) ( function interface -- word ) + name>> "::" rot name>> 3append create-in ; + +: family-tree ( definition -- definitions ) + dup parent>> [ family-tree ] [ { } ] if* + swap suffix ; + +: family-tree-functions ( definition -- functions ) + dup parent>> [ family-tree-functions ] [ { } ] if* + swap functions>> append ; + +: (define-word-for-function) ( function interface n -- ) + -rot [ (function-word) swap ] 2keep drop + { return>> parameters>> } get-slots + [ com-invoke ] 3curry + define ; + +: define-words-for-com-interface ( definition -- ) + [ [ (iid-word) ] [ iid>> 1quotation ] bi define ] + [ name>> "com-interface" swap typedef ] + [ + dup family-tree-functions + [ (define-word-for-function) ] with each-index + ] + tri ; + +PRIVATE> + +: COM-INTERFACE: + scan + scan find-com-interface-definition + scan string>guid + parse-com-functions + + dup save-com-interface-definition + define-words-for-com-interface + ; parsing + diff --git a/extra/windows/ole32/ole32.factor b/extra/windows/ole32/ole32.factor index ae3dafbc9f..a71a569f16 100644 --- a/extra/windows/ole32/ole32.factor +++ b/extra/windows/ole32/ole32.factor @@ -1,135 +1,136 @@ -USING: alien alien.syntax alien.c-types alien.strings math -kernel sequences windows windows.types combinators.lib ; -IN: windows.ole32 - -LIBRARY: ole32 - -TYPEDEF: GUID* REFGUID -TYPEDEF: void* LPUNKNOWN -TYPEDEF: wchar_t* LPOLESTR -TYPEDEF: wchar_t* LPCOLESTR - -TYPEDEF: REFGUID REFIID -TYPEDEF: REFGUID REFCLSID - -FUNCTION: HRESULT CoCreateInstance ( REFGUID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFGUID riid, LPUNKNOWN out_ppv ) ; -FUNCTION: BOOL IsEqualGUID ( REFGUID rguid1, REFGUID rguid2 ) ; -FUNCTION: int StringFromGUID2 ( REFGUID rguid, LPOLESTR lpsz, int cchMax ) ; -FUNCTION: HRESULT CLSIDFromString ( LPOLESTR lpsz, REFGUID out_rguid ) ; - -: S_OK 0 ; inline -: S_FALSE 1 ; inline -: E_NOINTERFACE HEX: 80004002 ; inline -: E_FAIL HEX: 80004005 ; inline -: E_INVALIDARG HEX: 80070057 ; inline - -: MK_ALT HEX: 20 ; inline -: DROPEFFECT_NONE 0 ; inline -: DROPEFFECT_COPY 1 ; inline -: DROPEFFECT_MOVE 2 ; inline -: DROPEFFECT_LINK 4 ; inline -: DROPEFFECT_SCROLL HEX: 80000000 ; inline -: DD_DEFSCROLLINSET 11 ; inline -: DD_DEFSCROLLDELAY 50 ; inline -: DD_DEFSCROLLINTERVAL 50 ; inline -: DD_DEFDRAGDELAY 200 ; inline -: DD_DEFDRAGMINDIST 2 ; inline - -: CF_TEXT 1 ; inline -: CF_BITMAP 2 ; inline -: CF_METAFILEPICT 3 ; inline -: CF_SYLK 4 ; inline -: CF_DIF 5 ; inline -: CF_TIFF 6 ; inline -: CF_OEMTEXT 7 ; inline -: CF_DIB 8 ; inline -: CF_PALETTE 9 ; inline -: CF_PENDATA 10 ; inline -: CF_RIFF 11 ; inline -: CF_WAVE 12 ; inline -: CF_UNICODETEXT 13 ; inline -: CF_ENHMETAFILE 14 ; inline -: CF_HDROP 15 ; inline -: CF_LOCALE 16 ; inline -: CF_MAX 17 ; inline - -: CF_OWNERDISPLAY HEX: 0080 ; inline -: CF_DSPTEXT HEX: 0081 ; inline -: CF_DSPBITMAP HEX: 0082 ; inline -: CF_DSPMETAFILEPICT HEX: 0083 ; inline -: CF_DSPENHMETAFILE HEX: 008E ; inline - -: DVASPECT_CONTENT 1 ; inline -: DVASPECT_THUMBNAIL 2 ; inline -: DVASPECT_ICON 4 ; inline -: DVASPECT_DOCPRINT 8 ; inline - -: TYMED_HGLOBAL 1 ; inline -: TYMED_FILE 2 ; inline -: TYMED_ISTREAM 4 ; inline -: TYMED_ISTORAGE 8 ; inline -: TYMED_GDI 16 ; inline -: TYMED_MFPICT 32 ; inline -: TYMED_ENHMF 64 ; inline -: TYMED_NULL 0 ; inline - -C-STRUCT: DVTARGETDEVICE - { "DWORD" "tdSize" } - { "WORD" "tdDriverNameOffset" } - { "WORD" "tdDeviceNameOffset" } - { "WORD" "tdPortNameOffset" } - { "WORD" "tdExtDevmodeOffset" } - { "BYTE[1]" "tdData" } ; - -TYPEDEF: WORD CLIPFORMAT -TYPEDEF: POINT POINTL - -C-STRUCT: FORMATETC - { "CLIPFORMAT" "cfFormat" } - { "DVTARGETDEVICE*" "ptd" } - { "DWORD" "dwAspect" } - { "LONG" "lindex" } - { "DWORD" "tymed" } ; -TYPEDEF: FORMATETC* LPFORMATETC - -C-STRUCT: STGMEDIUM - { "DWORD" "tymed" } - { "void*" "data" } - { "LPUNKNOWN" "punkForRelease" } ; -TYPEDEF: STGMEDIUM* LPSTGMEDIUM - -: COINIT_MULTITHREADED 0 ; inline -: COINIT_APARTMENTTHREADED 2 ; inline -: COINIT_DISABLE_OLE1DDE 4 ; inline -: COINIT_SPEED_OVER_MEMORY 8 ; inline - -FUNCTION: HRESULT OleInitialize ( void* reserved ) ; -FUNCTION: HRESULT CoInitializeEx ( void* reserved, DWORD dwCoInit ) ; - -FUNCTION: HRESULT RegisterDragDrop ( HWND hWnd, IDropTarget* pDropTarget ) ; -FUNCTION: HRESULT RevokeDragDrop ( HWND hWnd ) ; -FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ; - -: succeeded? ( hresult -- ? ) - 0 HEX: 7FFFFFFF between? ; - -: ole32-error ( hresult -- ) - dup succeeded? [ - drop - ] [ (win32-error-string) throw ] if ; - -: ole-initialize ( -- ) - f OleInitialize ole32-error ; - -: guid= ( a b -- ? ) - IsEqualGUID c-bool> ; - -: GUID-STRING-LENGTH - "{01234567-89ab-cdef-0123-456789abcdef}" length ; inline - -: string>guid ( string -- guid ) - utf16n string>alien "GUID" [ CLSIDFromString ole32-error ] keep ; -: guid>string ( guid -- string ) - GUID-STRING-LENGTH 1+ [ "ushort" ] keep - [ StringFromGUID2 drop ] { 2 } multikeep utf16n alien>string ; - +USING: alien alien.syntax alien.c-types alien.strings math +kernel sequences windows windows.types combinators.lib +math.order ; +IN: windows.ole32 + +LIBRARY: ole32 + +TYPEDEF: GUID* REFGUID +TYPEDEF: void* LPUNKNOWN +TYPEDEF: wchar_t* LPOLESTR +TYPEDEF: wchar_t* LPCOLESTR + +TYPEDEF: REFGUID REFIID +TYPEDEF: REFGUID REFCLSID + +FUNCTION: HRESULT CoCreateInstance ( REFGUID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFGUID riid, LPUNKNOWN out_ppv ) ; +FUNCTION: BOOL IsEqualGUID ( REFGUID rguid1, REFGUID rguid2 ) ; +FUNCTION: int StringFromGUID2 ( REFGUID rguid, LPOLESTR lpsz, int cchMax ) ; +FUNCTION: HRESULT CLSIDFromString ( LPOLESTR lpsz, REFGUID out_rguid ) ; + +: S_OK 0 ; inline +: S_FALSE 1 ; inline +: E_NOINTERFACE HEX: 80004002 ; inline +: E_FAIL HEX: 80004005 ; inline +: E_INVALIDARG HEX: 80070057 ; inline + +: MK_ALT HEX: 20 ; inline +: DROPEFFECT_NONE 0 ; inline +: DROPEFFECT_COPY 1 ; inline +: DROPEFFECT_MOVE 2 ; inline +: DROPEFFECT_LINK 4 ; inline +: DROPEFFECT_SCROLL HEX: 80000000 ; inline +: DD_DEFSCROLLINSET 11 ; inline +: DD_DEFSCROLLDELAY 50 ; inline +: DD_DEFSCROLLINTERVAL 50 ; inline +: DD_DEFDRAGDELAY 200 ; inline +: DD_DEFDRAGMINDIST 2 ; inline + +: CF_TEXT 1 ; inline +: CF_BITMAP 2 ; inline +: CF_METAFILEPICT 3 ; inline +: CF_SYLK 4 ; inline +: CF_DIF 5 ; inline +: CF_TIFF 6 ; inline +: CF_OEMTEXT 7 ; inline +: CF_DIB 8 ; inline +: CF_PALETTE 9 ; inline +: CF_PENDATA 10 ; inline +: CF_RIFF 11 ; inline +: CF_WAVE 12 ; inline +: CF_UNICODETEXT 13 ; inline +: CF_ENHMETAFILE 14 ; inline +: CF_HDROP 15 ; inline +: CF_LOCALE 16 ; inline +: CF_MAX 17 ; inline + +: CF_OWNERDISPLAY HEX: 0080 ; inline +: CF_DSPTEXT HEX: 0081 ; inline +: CF_DSPBITMAP HEX: 0082 ; inline +: CF_DSPMETAFILEPICT HEX: 0083 ; inline +: CF_DSPENHMETAFILE HEX: 008E ; inline + +: DVASPECT_CONTENT 1 ; inline +: DVASPECT_THUMBNAIL 2 ; inline +: DVASPECT_ICON 4 ; inline +: DVASPECT_DOCPRINT 8 ; inline + +: TYMED_HGLOBAL 1 ; inline +: TYMED_FILE 2 ; inline +: TYMED_ISTREAM 4 ; inline +: TYMED_ISTORAGE 8 ; inline +: TYMED_GDI 16 ; inline +: TYMED_MFPICT 32 ; inline +: TYMED_ENHMF 64 ; inline +: TYMED_NULL 0 ; inline + +C-STRUCT: DVTARGETDEVICE + { "DWORD" "tdSize" } + { "WORD" "tdDriverNameOffset" } + { "WORD" "tdDeviceNameOffset" } + { "WORD" "tdPortNameOffset" } + { "WORD" "tdExtDevmodeOffset" } + { "BYTE[1]" "tdData" } ; + +TYPEDEF: WORD CLIPFORMAT +TYPEDEF: POINT POINTL + +C-STRUCT: FORMATETC + { "CLIPFORMAT" "cfFormat" } + { "DVTARGETDEVICE*" "ptd" } + { "DWORD" "dwAspect" } + { "LONG" "lindex" } + { "DWORD" "tymed" } ; +TYPEDEF: FORMATETC* LPFORMATETC + +C-STRUCT: STGMEDIUM + { "DWORD" "tymed" } + { "void*" "data" } + { "LPUNKNOWN" "punkForRelease" } ; +TYPEDEF: STGMEDIUM* LPSTGMEDIUM + +: COINIT_MULTITHREADED 0 ; inline +: COINIT_APARTMENTTHREADED 2 ; inline +: COINIT_DISABLE_OLE1DDE 4 ; inline +: COINIT_SPEED_OVER_MEMORY 8 ; inline + +FUNCTION: HRESULT OleInitialize ( void* reserved ) ; +FUNCTION: HRESULT CoInitializeEx ( void* reserved, DWORD dwCoInit ) ; + +FUNCTION: HRESULT RegisterDragDrop ( HWND hWnd, IDropTarget* pDropTarget ) ; +FUNCTION: HRESULT RevokeDragDrop ( HWND hWnd ) ; +FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ; + +: succeeded? ( hresult -- ? ) + 0 HEX: 7FFFFFFF between? ; + +: ole32-error ( hresult -- ) + dup succeeded? [ + drop + ] [ (win32-error-string) throw ] if ; + +: ole-initialize ( -- ) + f OleInitialize ole32-error ; + +: guid= ( a b -- ? ) + IsEqualGUID c-bool> ; + +: GUID-STRING-LENGTH + "{01234567-89ab-cdef-0123-456789abcdef}" length ; inline + +: string>guid ( string -- guid ) + utf16n string>alien "GUID" [ CLSIDFromString ole32-error ] keep ; +: guid>string ( guid -- string ) + GUID-STRING-LENGTH 1+ [ "ushort" ] keep + [ StringFromGUID2 drop ] { 2 } multikeep utf16n alien>string ; +