From 407867e352d5b1d51aeaafd4f538af62acc7dca8 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Sat, 9 Dec 2006 11:50:08 +0000 Subject: [PATCH] *** empty log message *** --- ase/ase.dsw | 2 +- ase/awk/extio.c | 24 +-- ase/awk/parse.c | 16 +- ase/com/Awk.cpp | 401 +++++++++++++++++++++++++++++++++++++++++++ ase/com/Awk.h | 70 ++++++++ ase/com/Awk.rgs | 25 +++ ase/com/AwkExtio.cpp | 57 ++++++ ase/com/AwkExtio.h | 42 +++++ ase/com/AwkExtio.rgs | 26 +++ ase/com/Buffer.cpp | 36 ++++ ase/com/Buffer.h | 37 ++++ ase/com/Buffer.rgs | 26 +++ ase/com/ase.cpp | 76 ++++++++ ase/com/ase.idl | 135 +++++++++++++++ ase/com/ase.rc | 126 ++++++++++++++ ase/com/awk_cp.h | 174 +++++++++++++++++++ ase/com/resource.h | 19 ++ ase/com/stdafx.cpp | 12 ++ ase/com/stdafx.h | 27 +++ 19 files changed, 1310 insertions(+), 21 deletions(-) create mode 100644 ase/com/Awk.cpp create mode 100644 ase/com/Awk.h create mode 100644 ase/com/Awk.rgs create mode 100644 ase/com/AwkExtio.cpp create mode 100644 ase/com/AwkExtio.h create mode 100644 ase/com/AwkExtio.rgs create mode 100644 ase/com/Buffer.cpp create mode 100644 ase/com/Buffer.h create mode 100644 ase/com/Buffer.rgs create mode 100644 ase/com/ase.cpp create mode 100644 ase/com/ase.idl create mode 100644 ase/com/ase.rc create mode 100644 ase/com/awk_cp.h create mode 100644 ase/com/resource.h create mode 100644 ase/com/stdafx.cpp create mode 100644 ase/com/stdafx.h diff --git a/ase/ase.dsw b/ase/ase.dsw index 02e8b26e..0c1196f4 100644 --- a/ase/ase.dsw +++ b/ase/ase.dsw @@ -15,7 +15,7 @@ Package=<4> ############################################################################### -Project: "awk.com"=.\com\awk\awk.dsp - Package Owner=<4> +Project: "ase.com"=.\com\ase.dsp - Package Owner=<4> Package=<5> {{{ diff --git a/ase/awk/extio.c b/ase/awk/extio.c index 32e25652..b40d462f 100644 --- a/ase/awk/extio.c +++ b/ase/awk/extio.c @@ -1,5 +1,5 @@ /* - * $Id: extio.c,v 1.65 2006-11-29 02:54:15 bacon Exp $ + * $Id: extio.c,v 1.66 2006-12-09 11:49:03 bacon Exp $ */ #include @@ -143,7 +143,7 @@ int ase_awk_readextio ( p->in.eos = ase_false; n = handler (ASE_AWK_IO_OPEN, p, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { ASE_AWK_FREE (run->awk, p->name); ASE_AWK_FREE (run->awk, p); @@ -226,7 +226,7 @@ int ase_awk_readextio ( n = handler (ASE_AWK_IO_READ, p, p->in.buf, ASE_COUNTOF(p->in.buf)); - if (n == -1) + if (n <= -1) { /* handler error. getline should return -1 */ /* TODO: use meaningful error code */ @@ -477,7 +477,7 @@ int ase_awk_writeextio_str ( p->out.eos = ase_false; n = handler (ASE_AWK_IO_OPEN, p, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { ASE_AWK_FREE (run->awk, p->name); ASE_AWK_FREE (run->awk, p); @@ -524,7 +524,7 @@ int ase_awk_writeextio_str ( { n = handler (ASE_AWK_IO_WRITE, p, str, len); - if (n == -1) + if (n <= -1) { /* TODO: use meaningful error code */ if (ase_awk_setglobal ( @@ -584,7 +584,7 @@ int ase_awk_flushextio ( { n = handler (ASE_AWK_IO_FLUSH, p, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { /* TODO: use meaningful error code */ if (ase_awk_setglobal ( @@ -662,7 +662,7 @@ int ase_awk_nextextio_read ( } n = handler (ASE_AWK_IO_NEXT, p, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { /* TODO: is this errnum correct? */ run->errnum = ASE_AWK_EIOHANDLER; @@ -741,7 +741,7 @@ int ase_awk_nextextio_write ( } n = handler (ASE_AWK_IO_NEXT, p, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { /* TODO: is this errnum correct? */ run->errnum = ASE_AWK_EIOHANDLER; @@ -802,7 +802,7 @@ int ase_awk_closeextio_read ( handler = run->extio.handler[p->type & __MASK_CLEAR]; if (handler != ASE_NULL) { - if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) == -1) + if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) { /* this is not a run-time error.*/ /* TODO: set ERRNO */ @@ -865,7 +865,7 @@ int ase_awk_closeextio_write ( handler = run->extio.handler[p->type & __MASK_CLEAR]; if (handler != ASE_NULL) { - if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) == -1) + if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) { /* this is not a run-time error.*/ /* TODO: set ERRNO */ @@ -907,7 +907,7 @@ int ase_awk_closeextio (ase_awk_run_t* run, const ase_char_t* name) handler = run->extio.handler[p->type & __MASK_CLEAR]; if (handler != ASE_NULL) { - if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) == -1) + if (handler (ASE_AWK_IO_CLOSE, p, ASE_NULL, 0) <= -1) { /* this is not a run-time error.*/ /* TODO: set ERRNO */ @@ -949,7 +949,7 @@ void ase_awk_clearextio (ase_awk_run_t* run) if (handler != ASE_NULL) { n = handler (ASE_AWK_IO_CLOSE, run->extio.chain, ASE_NULL, 0); - if (n == -1) + if (n <= -1) { /* TODO: * some warning actions need to be taken */ diff --git a/ase/awk/parse.c b/ase/awk/parse.c index a425b9f7..67397f02 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.217 2006-12-08 06:02:41 bacon Exp $ + * $Id: parse.c,v 1.218 2006-12-09 11:49:03 bacon Exp $ */ #include @@ -371,7 +371,7 @@ static int __parse (ase_awk_t* awk) op = awk->src.ios.in ( ASE_AWK_IO_OPEN, awk->src.ios.custom_data, ASE_NULL, 0); - if (op == -1) + if (op <= -1) { /* cannot open the source file. * it doesn't even have to call CLOSE */ @@ -431,9 +431,9 @@ static int __parse (ase_awk_t* awk) exit_parse: if (awk->src.ios.in ( - ASE_AWK_IO_CLOSE, awk->src.ios.custom_data, ASE_NULL, 0) == -1) + ASE_AWK_IO_CLOSE, awk->src.ios.custom_data, ASE_NULL, 0) != 0) { - if (n != -1) + if (n == 0) { /* this is to keep the earlier error above * that might be more critical than this */ @@ -4161,7 +4161,7 @@ static int __get_char (ase_awk_t* awk) n = awk->src.ios.in ( ASE_AWK_IO_READ, awk->src.ios.custom_data, awk->src.shared.buf, ASE_COUNTOF(awk->src.shared.buf)); - if (n == -1) + if (n <= -1) { awk->errnum = ASE_AWK_ESRCINREAD; return -1; @@ -4372,7 +4372,7 @@ static int __deparse (ase_awk_t* awk) op = awk->src.ios.out ( ASE_AWK_IO_OPEN, awk->src.ios.custom_data, ASE_NULL, 0); - if (op == -1) + if (op <= -1) { awk->errnum = ASE_AWK_ESRCOUTOPEN; return -1; @@ -4509,9 +4509,9 @@ static int __deparse (ase_awk_t* awk) exit_deparse: if (awk->src.ios.out ( - ASE_AWK_IO_CLOSE, awk->src.ios.custom_data, ASE_NULL, 0) == -1) + ASE_AWK_IO_CLOSE, awk->src.ios.custom_data, ASE_NULL, 0) != 0) { - if (n != -1) + if (n == 0) { awk->errnum = ASE_AWK_ESRCOUTCLOSE; n = -1; diff --git a/ase/com/Awk.cpp b/ase/com/Awk.cpp new file mode 100644 index 00000000..1bf5e019 --- /dev/null +++ b/ase/com/Awk.cpp @@ -0,0 +1,401 @@ +/* + * $Id: Awk.cpp,v 1.1 2006-12-09 11:50:07 bacon Exp $ + */ + +#include "stdafx.h" +#include "ase.h" +#include "Awk.h" +#include "Buffer.h" +#include +#include +#include +#include +#include + +STDMETHODIMP CAwk::InterfaceSupportsErrorInfo(REFIID riid) +{ + static const IID* arr[] = + { + &IID_IAwk, + }; + + for (int i=0;iRelease (); + } + + if (read_source_buf != NULL) + { + read_source_buf->Release (); + } + + if (handle != NULL) + { + ase_awk_close (handle); + handle = NULL; + } +} + +static void* __awk_malloc (ase_size_t n, void* custom_data) +{ + return malloc (n); +} + +static void* __awk_realloc (void* ptr, ase_size_t n, void* custom_data) +{ + return realloc (ptr, n); +} + +static void __awk_free (void* ptr, void* custom_data) +{ + free (ptr); +} + +static ase_real_t __awk_pow (ase_real_t x, ase_real_t y) +{ + return pow (x, y); +} + +static int __awk_sprintf ( + ase_char_t* buf, ase_size_t len, const ase_char_t* fmt, ...) +{ + int n; + va_list ap; + + va_start (ap, fmt); +#if defined(_WIN32) + n = _vsntprintf (buf, len, fmt, ap); + if (n < 0 || (ase_size_t)n >= len) + { + if (len > 0) buf[len-1] = ASE_T('\0'); + n = -1; + } +#elif defined(__MSDOS__) + /* TODO: check buffer overflow */ + n = vsprintf (buf, fmt, ap); +#else + n = xp_vsprintf (buf, len, fmt, ap); +#endif + va_end (ap); + return n; +} + +static void __awk_aprintf (const ase_char_t* fmt, ...) +{ + va_list ap; +#ifdef _WIN32 + int n; + ase_char_t buf[1024]; +#endif + + va_start (ap, fmt); +#if defined(_WIN32) + n = _vsntprintf (buf, ASE_COUNTOF(buf), fmt, ap); + if (n < 0) buf[ASE_COUNTOF(buf)-1] = ASE_T('\0'); + + #if defined(_MSC_VER) && (_MSC_VER<1400) + MessageBox (NULL, buf, + ASE_T("Assertion Failure"), MB_OK|MB_ICONERROR); + #else + MessageBox (NULL, buf, + ASE_T("\uB2DD\uAE30\uB9AC \uC870\uB610"), MB_OK|MB_ICONERROR); + #endif +#elif defined(__MSDOS__) + vprintf (fmt, ap); +#else + xp_vprintf (fmt, ap); +#endif + va_end (ap); +} + +static void __awk_dprintf (const ase_char_t* fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + +#if defined(_WIN32) + _vftprintf (stderr, fmt, ap); +#elif defined(__MSDOS__) + vfprintf (stderr, fmt, ap); +#else + xp_vfprintf (stderr, fmt, ap); +#endif + + va_end (ap); +} + +static ase_ssize_t __read_source ( + int cmd, void* arg, ase_char_t* data, ase_size_t count) +{ + CAwk* awk = (CAwk*)arg; + + if (cmd == ASE_AWK_IO_OPEN) + { + return (ase_ssize_t)awk->Fire_OpenSource (0); + } + else if (cmd == ASE_AWK_IO_CLOSE) + { + return (ase_ssize_t)awk->Fire_CloseSource (0); + } + else if (cmd == ASE_AWK_IO_READ) + { + HRESULT hr; + CComBSTR val; + + if (awk->read_source_buf == NULL) + { + hr = CoCreateInstance ( + CLSID_Buffer, NULL, CLSCTX_ALL, + IID_IBuffer, (void**)&awk->read_source_buf); + if (FAILED(hr)) + { +MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); + return -1; + } + + awk->read_source_pos = 0; + awk->read_source_len = 0; + } + + if (awk->read_source_pos >= awk->read_source_len) + { + LONG n = awk->Fire_ReadSource (awk->read_source_buf); + if (n <= 0) return (ase_ssize_t)n; + + awk->read_source_buf->get_Value (&val); + if (n > (LONG)val.Length()) return -1; + + awk->read_source_pos = 0; + awk->read_source_len = n; + } + else + { + awk->read_source_buf->get_Value (&val); + } + + ASE_AWK_ASSERT (awk->handle, + awk->read_source_pos < awk->read_source_len); + + LONG left = awk->read_source_len - awk->read_source_pos; + if (left > (ase_ssize_t)count) + { + memcpy (data, + ((TCHAR*)(BSTR)val)+awk->read_source_pos, + count * ASE_SIZEOF(ase_char_t)); + awk->read_source_pos += count; + return count; + } + else + { + memcpy (data, + ((TCHAR*)(BSTR)val)+awk->read_source_pos, + left * ASE_SIZEOF(ase_char_t)); + awk->read_source_pos = 0; + awk->read_source_len = 0; + return (ase_ssize_t)left; + } + } + + + return -1; +} + +static ase_ssize_t __write_source ( + int cmd, void* arg, ase_char_t* data, ase_size_t count) +{ + CAwk* awk = (CAwk*)arg; + + if (cmd == ASE_AWK_IO_OPEN) + { + return (ase_ssize_t)awk->Fire_OpenSource (1); + } + else if (cmd == ASE_AWK_IO_CLOSE) + { + return (ase_ssize_t)awk->Fire_CloseSource (1); + } + else if (cmd == ASE_AWK_IO_WRITE) + { + HRESULT hr; + + if (awk->write_source_buf == NULL) + { + hr = CoCreateInstance ( + CLSID_Buffer, NULL, CLSCTX_ALL, + IID_IBuffer, (void**)&awk->write_source_buf); + if (FAILED(hr)) + { +MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); + return -1; + } + } + + awk->write_source_buf->put_Value (CComBSTR(count,data)); + LONG n = awk->Fire_WriteSource (awk->write_source_buf); + + /* + ASE_AWK_ASSERTX ( + awk->handle, n <= (LONG)count, + "the source code output stream should not return more than requested"); + */ + if (n > (LONG)count) return -1; + + return (ase_ssize_t)n; + } + + return -1; +} + +HRESULT CAwk::Parse (int* ret) +{ + if (handle == NULL) + { + ase_awk_syscas_t syscas; + + memset (&syscas, 0, sizeof(syscas)); + syscas.malloc = __awk_malloc; + syscas.realloc = __awk_realloc; + syscas.free = __awk_free; + + syscas.is_upper = iswupper; + syscas.is_lower = iswlower; + syscas.is_alpha = iswalpha; + syscas.is_digit = iswdigit; + syscas.is_xdigit = iswxdigit; + syscas.is_alnum = iswalnum; + syscas.is_space = iswspace; + syscas.is_print = iswprint; + syscas.is_graph = iswgraph; + syscas.is_cntrl = iswcntrl; + syscas.is_punct = iswpunct; + syscas.to_upper = towupper; + syscas.to_lower = towlower; + + syscas.memcpy = memcpy; + syscas.memset = memset; + syscas.pow = __awk_pow; + syscas.sprintf = __awk_sprintf; + syscas.aprintf = __awk_aprintf; + syscas.dprintf = __awk_dprintf; + syscas.abort = abort; + + handle = ase_awk_open (&syscas); + if (handle == NULL) + { + *ret = -1; + return S_OK; + } + + int opt = /*ASE_AWK_IMPLICIT | + ASE_AWK_EXPLICIT | + ASE_AWK_UNIQUEAFN | + ASE_AWK_HASHSIGN | + ASE_AWK_IDIV | + ASE_AWK_SHADING | + ASE_AWK_SHIFT | */ + ASE_AWK_EXTIO /*| + ASE_AWK_BLOCKLESS | + ASE_AWK_STRINDEXONE | + ASE_AWK_STRIPSPACES | + ASE_AWK_NEXTOFILE*/; + + ase_awk_setopt (handle, opt); + } + + ase_awk_srcios_t srcios; + + srcios.in = __read_source; + srcios.out = __write_source; + srcios.custom_data = this; + + + if (ase_awk_parse (handle, &srcios) == -1) + { + *ret = -1; + return S_OK; + } + + *ret = 0; + return S_OK; +} + +static ase_ssize_t __process_extio ( + int cmd, void* arg, ase_char_t* data, ase_size_t size) +{ + ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; + CAwk* awk = (CAwk*)epa->custom_data; + + if (cmd == ASE_AWK_IO_OPEN) + { + + } + else if (cmd == ASE_AWK_IO_CLOSE) + { + } + else if (cmd == ASE_AWK_IO_READ) + { + } + else if (cmd == ASE_AWK_IO_WRITE) + { + } + else if (cmd == ASE_AWK_IO_FLUSH) + { + } + else if (cmd == ASE_AWK_IO_NEXT) + { + } + + return -1; +} + +HRESULT CAwk::Run (int* ret) +{ + if (handle == NULL) + { + /* TODO: better error handling... */ + /* call parse first... */ + *ret = -1; + return S_OK; + } + + ase_awk_runios_t runios; + runios.pipe = __process_extio; + runios.coproc = NULL; + runios.file = NULL; + runios.console = NULL; + runios.custom_data = this; + + if (ase_awk_run (handle, NULL, &runios, NULL, NULL, this) == -1) + { + *ret = -1; + return S_OK; + } + + *ret = 0; + return S_OK; +} diff --git a/ase/com/Awk.h b/ase/com/Awk.h new file mode 100644 index 00000000..13782005 --- /dev/null +++ b/ase/com/Awk.h @@ -0,0 +1,70 @@ +/* + * $Id: Awk.h,v 1.1 2006-12-09 11:50:07 bacon Exp $ + */ + +#ifndef _ASE_COM_AWK_H_ +#define _ASE_COM_AWK_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "resource.h" +#include "ase.h" +#include "awk_cp.h" +#include + +///////////////////////////////////////////////////////////////////////////// +// CAwk + +class CAwk : + public IDispatchImpl, + public ISupportErrorInfo, + /*public CComObjectRoot,*/ + public CComObjectRootEx, + public CComCoClass, + public IConnectionPointContainerImpl, + public IProvideClassInfo2Impl<&CLSID_Awk, &DIID_IAwkEvents, &LIBID_ASELib>, + public CProxyIAwkEvents< CAwk > + +{ +public: + ase_awk_t* handle; + IBuffer* read_source_buf; + IBuffer* write_source_buf; + + ase_size_t read_source_pos; + ase_size_t read_source_len; + +public: + CAwk(); + ~CAwk (); + +BEGIN_COM_MAP(CAwk) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(IAwk) + COM_INTERFACE_ENTRY(ISupportErrorInfo) + COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) + COM_INTERFACE_ENTRY(IProvideClassInfo) + COM_INTERFACE_ENTRY(IProvideClassInfo2) +END_COM_MAP() + +BEGIN_CONNECTION_POINT_MAP(CAwk) +CONNECTION_POINT_ENTRY(DIID_IAwkEvents) +END_CONNECTION_POINT_MAP() + +//DECLARE_NOT_AGGREGATABLE(CAwk) +// Remove the comment from the line above if you don't want your object to +// support aggregation. + +DECLARE_REGISTRY_RESOURCEID(IDR_AWK) +// ISupportsErrorInfo + STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); + +// IAwk +public: + HRESULT __stdcall Parse (int* ret); + HRESULT __stdcall Run (int* ret); +}; + +#endif diff --git a/ase/com/Awk.rgs b/ase/com/Awk.rgs new file mode 100644 index 00000000..14991e89 --- /dev/null +++ b/ase/com/Awk.rgs @@ -0,0 +1,25 @@ +HKCR +{ + ASE.Awk.1 = s 'ASE Awk Class' + { + CLSID = s '{AD863B53-F5EC-45C3-8B1C-6AC678227DC8}' + } + ASE.Awk = s 'ASE Awk Class' + { + CLSID = s '{AD863B53-F5EC-45C3-8B1C-6AC678227DC8}' + } + NoRemove CLSID + { + ForceRemove {AD863B53-F5EC-45C3-8B1C-6AC678227DC8} = s 'ASE Awk Class' + { + ProgID = s 'ASE.Awk.1' + VersionIndependentProgID = s 'ASE.Awk' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{F9C69806-16A1-4162-998A-876B33C470BF}' + } + } +} diff --git a/ase/com/AwkExtio.cpp b/ase/com/AwkExtio.cpp new file mode 100644 index 00000000..0b883996 --- /dev/null +++ b/ase/com/AwkExtio.cpp @@ -0,0 +1,57 @@ +/* + * $Id: AwkExtio.cpp,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +#include "stdafx.h" +#include "ase.h" +#include "AwkExtio.h" + +///////////////////////////////////////////////////////////////////////////// +// CAwkExtio + +CAwkExtio::CAwkExtio () +{ +} + +CAwkExtio::~CAwkExtio () +{ +} + +STDMETHODIMP CAwkExtio::get_Name(BSTR *pVal) +{ + + *pVal = name; + return S_OK; +} + +STDMETHODIMP CAwkExtio::put_Name(BSTR newVal) +{ + name = newVal; + return S_OK; +} + +STDMETHODIMP CAwkExtio::get_Type(int *pVal) +{ + *pVal = type; + return S_OK; +} + +STDMETHODIMP CAwkExtio::put_Type(int newVal) +{ + type = newVal; + return S_OK; +} + +STDMETHODIMP CAwkExtio::get_Mode(int *pVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} + +STDMETHODIMP CAwkExtio::put_Mode(int newVal) +{ + // TODO: Add your implementation code here + + return S_OK; +} diff --git a/ase/com/AwkExtio.h b/ase/com/AwkExtio.h new file mode 100644 index 00000000..7e01f0ad --- /dev/null +++ b/ase/com/AwkExtio.h @@ -0,0 +1,42 @@ +// AwkExtio.h : Declaration of the CAwkExtio + +#ifndef __AWKEXTIO_H_ +#define __AWKEXTIO_H_ + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CAwkExtio +class ATL_NO_VTABLE CAwkExtio : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +public: + CComBSTR name; + int type; + int mode; + + CAwkExtio (); + ~CAwkExtio (); + +DECLARE_REGISTRY_RESOURCEID(IDR_AWKEXTIO) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CAwkExtio) + COM_INTERFACE_ENTRY(IAwkExtio) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +// IAwkExtio +public: + STDMETHOD(get_Mode)(/*[out, retval]*/ int *pVal); + STDMETHOD(put_Mode)(/*[in]*/ int newVal); + STDMETHOD(get_Type)(/*[out, retval]*/ int *pVal); + STDMETHOD(put_Type)(/*[in]*/ int newVal); + STDMETHOD(get_Name)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Name)(/*[in]*/ BSTR newVal); +}; + +#endif //__AWKEXTIO_H_ diff --git a/ase/com/AwkExtio.rgs b/ase/com/AwkExtio.rgs new file mode 100644 index 00000000..25dd5757 --- /dev/null +++ b/ase/com/AwkExtio.rgs @@ -0,0 +1,26 @@ +HKCR +{ + ASE.AwkExtio.1 = s 'ASE AwkExtio Class' + { + CLSID = s '{F52F065A-5FD4-4F4D-AFEA-F5E446B16383}' + } + ASE.AwkExtio = s 'ASE AwkExtio Class' + { + CLSID = s '{F52F065A-5FD4-4F4D-AFEA-F5E446B16383}' + CurVer = s 'ASE.AwkExtio.1' + } + NoRemove CLSID + { + ForceRemove {F52F065A-5FD4-4F4D-AFEA-F5E446B16383} = s 'ASE AwkExtio Class' + { + ProgID = s 'ASE.AwkExtio.1' + VersionIndependentProgID = s 'ASE.AwkExtio' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{F9C69806-16A1-4162-998A-876B33C470BF}' + } + } +} diff --git a/ase/com/Buffer.cpp b/ase/com/Buffer.cpp new file mode 100644 index 00000000..22dce3fa --- /dev/null +++ b/ase/com/Buffer.cpp @@ -0,0 +1,36 @@ +/* + * $Id: Buffer.cpp,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +#include "stdafx.h" +#include "Buffer.h" + +CBuffer::CBuffer () +{ +#ifdef _DEBUG + TCHAR x[128]; + _sntprintf (x, 128, _T("CBuffer::~CBuffer %p"), this); + MessageBox (NULL, x, x, MB_OK); +#endif +} + +CBuffer::~CBuffer () +{ +#ifdef _DEBUG + TCHAR x[128]; + _sntprintf (x, 128, _T("CBuffer::~CBuffer %p"), this); + MessageBox (NULL, x, x, MB_OK); +#endif +} + +STDMETHODIMP CBuffer::get_Value(BSTR *pVal) +{ + *pVal = str; + return S_OK; +} + +STDMETHODIMP CBuffer::put_Value(BSTR newVal) +{ + str = newVal; + return S_OK; +} diff --git a/ase/com/Buffer.h b/ase/com/Buffer.h new file mode 100644 index 00000000..fab37fb6 --- /dev/null +++ b/ase/com/Buffer.h @@ -0,0 +1,37 @@ +/* + * $Id: Buffer.h,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +#ifndef _ASE_COM_BUFFER_H_ +#define _ASE_COM_BUFFER_H_ + +#include "resource.h" +#include "ase.h" + +class ATL_NO_VTABLE CBuffer : + public CComObjectRootEx, + public CComCoClass, + public IDispatchImpl +{ +private: + CComBSTR str; + +public: + CBuffer (); + ~CBuffer (); + +DECLARE_REGISTRY_RESOURCEID(IDR_AWKBUFFER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CBuffer) + COM_INTERFACE_ENTRY(IBuffer) + COM_INTERFACE_ENTRY(IDispatch) +END_COM_MAP() + +public: + STDMETHOD(get_Value)(/*[out, retval]*/ BSTR *pVal); + STDMETHOD(put_Value)(/*[in]*/ BSTR newVal); +}; + +#endif diff --git a/ase/com/Buffer.rgs b/ase/com/Buffer.rgs new file mode 100644 index 00000000..e4ffa37e --- /dev/null +++ b/ase/com/Buffer.rgs @@ -0,0 +1,26 @@ +HKCR +{ + ASE.Buffer.1 = s 'ASE Buffer Class' + { + CLSID = s '{866B79A7-7628-4808-8AE7-784BE2491C80}' + } + ASE.Buffer = s 'ASE Buffer Class' + { + CLSID = s '{866B79A7-7628-4808-8AE7-784BE2491C80}' + CurVer = s 'ASE.Buffer.1' + } + NoRemove CLSID + { + ForceRemove {866B79A7-7628-4808-8AE7-784BE2491C80} = s 'ASE Buffer Class' + { + ProgID = s 'ASE.Buffer.1' + VersionIndependentProgID = s 'ASE.Buffer' + ForceRemove 'Programmable' + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'TypeLib' = s '{F9C69806-16A1-4162-998A-876B33C470BF}' + } + } +} diff --git a/ase/com/ase.cpp b/ase/com/ase.cpp new file mode 100644 index 00000000..21fea112 --- /dev/null +++ b/ase/com/ase.cpp @@ -0,0 +1,76 @@ +/* + * $Id: ase.cpp,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +// Note: Proxy/Stub Information +// To build a separate proxy/stub DLL, +// run nmake -f aseps.mk in the project directory. + +#include "stdafx.h" +#include "resource.h" +#include +#include "ase.h" + +#include "ase_i.c" +#include "Awk.h" +#include "Buffer.h" +#include "AwkExtio.h" + +CComModule _Module; + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_Awk, CAwk) +OBJECT_ENTRY(CLSID_Buffer, CBuffer) +OBJECT_ENTRY(CLSID_AwkExtio, CAwkExtio) +END_OBJECT_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DLL Entry Point + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + _Module.Init(ObjectMap, hInstance, &LIBID_ASELib); + DisableThreadLibraryCalls(hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + _Module.Term(); + return TRUE; // ok +} + +///////////////////////////////////////////////////////////////////////////// +// Used to determine whether the DLL can be unloaded by OLE + +STDAPI DllCanUnloadNow(void) +{ + return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; +} + +///////////////////////////////////////////////////////////////////////////// +// Returns a class factory to create an object of the requested type + +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) +{ + return _Module.GetClassObject(rclsid, riid, ppv); +} + +///////////////////////////////////////////////////////////////////////////// +// DllRegisterServer - Adds entries to the system registry + +STDAPI DllRegisterServer(void) +{ + // registers object, typelib and all interfaces in typelib + return _Module.RegisterServer(TRUE); +} + +///////////////////////////////////////////////////////////////////////////// +// DllUnregisterServer - Removes entries from the system registry + +STDAPI DllUnregisterServer(void) +{ + return _Module.UnregisterServer(TRUE); +} + + diff --git a/ase/com/ase.idl b/ase/com/ase.idl new file mode 100644 index 00000000..4fe13c55 --- /dev/null +++ b/ase/com/ase.idl @@ -0,0 +1,135 @@ +/* + * $Id: ase.idl,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +import "oaidl.idl"; +import "ocidl.idl"; + +/* IAwk */ +[ + object, + uuid(05BC1C9F-7C4E-4F77-B186-2E0FD26C0641), + dual, + helpstring("ASE Awk Interface"), + pointer_default(unique) +] +interface IAwk : IDispatch +{ + [id(1), helpstring("method Parse")] + HRESULT Parse([out, retval] int* ret); + + [id(2), helpstring("method Run")] + HRESULT Run([out, retval] int* ret); +}; + +/* ASELib */ +[ + uuid(F9C69806-16A1-4162-998A-876B33C470BF), + version(1.0), + helpstring("ASE 1.0 Type Library") +] +library ASELib +{ + importlib("stdole32.tlb"); + importlib("stdole2.tlb"); + + + /* IBuffer */ + [ + object, + uuid(AD5EA986-37E9-410E-A78E-21799104293A), + dual, + helpstring("IBuffer Interface"), + pointer_default(unique) + ] + interface IBuffer : IDispatch + { + [propget, id(1), helpstring("property Value")] + HRESULT Value([out, retval] BSTR *pVal); + + [propput, id(1), helpstring("property Value")] + HRESULT Value([in] BSTR newVal); + }; + + /* IAwkEvents */ + [ + uuid(1351DC8F-10AD-4C40-A2FA-9A2E89C27AC8), + helpstring("ASE Awk Events Interface") + ] + dispinterface IAwkEvents + { + properties: + methods: + [id(1), helpstring("method OpenSource")] + int OpenSource([in] int mode); + + [id(2), helpstring("method CloseSource")] + int CloseSource([in] int mode); + + [id(3), helpstring("method ReadSource")] + int ReadSource([in] IBuffer* buf); + + [id(4), helpstring("method WriteSource")] + int WriteSource([in] IBuffer* buf); + }; + + /* IAwkExtio */ + [ + object, + uuid(BE0B91FF-9944-4DFC-A55B-1FE14E24AFEE), + dual, + helpstring("IAwkExtio Interface"), + pointer_default(unique) + ] + interface IAwkExtio : IDispatch + { + [propget, id(1), helpstring("property Name")] + HRESULT Name([out, retval] BSTR *pVal); + + /*[propput, id(1), helpstring("property Name")] + HRESULT Value([in] BSTR newVal); */ + + [propget, id(2), helpstring("property Type")] + HRESULT Type([out, retval] int *pVal); + + /*[propput, id(2), helpstring("property Type")] + HRESULT Type([in] int newVal);*/ + + [propget, id(3), helpstring("property Mode")] + HRESULT Mode([out, retval] int *pVal); + + /*[propput, id(3), helpstring("property Mode")] + HRESULT Mode([in] int newVal);*/ + }; + + /* Awk */ + [ + uuid(AD863B53-F5EC-45C3-8B1C-6AC678227DC8), + helpstring("ASE Awk Class") + ] + coclass Awk + { + [default] interface IAwk; + [default,source] dispinterface IAwkEvents; + }; + + /* AwkExtio */ + [ + uuid(F52F065A-5FD4-4F4D-AFEA-F5E446B16383), + helpstring("ASE AwkExtio Class") + ] + coclass AwkExtio + { + [default] interface IAwkExtio; + }; + + /* Buffer */ + [ + uuid(866B79A7-7628-4808-8AE7-784BE2491C80), + helpstring("ASE Buffer Class") + ] + coclass Buffer + { + [default] interface IBuffer; + }; +}; diff --git a/ase/com/ase.rc b/ase/com/ase.rc new file mode 100644 index 00000000..64a7dfa4 --- /dev/null +++ b/ase/com/ase.rc @@ -0,0 +1,126 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "1 TYPELIB ""ase.tlb""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "ASE Module\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "ASE\0" + VALUE "LegalCopyright", "Copyright 2006\0" + VALUE "OriginalFilename", "ase.dll\0" + VALUE "ProductName", "ASE Module\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + VALUE "OLESelfRegister", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// + +IDR_AWK REGISTRY DISCARDABLE "Awk.rgs" +IDR_AWKBUFFER REGISTRY DISCARDABLE "Buffer.rgs" +IDR_AWKEXTIO REGISTRY DISCARDABLE "AwkExtio.rgs" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_PROJNAME "ASE COM Project" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "ase.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/ase/com/awk_cp.h b/ase/com/awk_cp.h new file mode 100644 index 00000000..d98ed659 --- /dev/null +++ b/ase/com/awk_cp.h @@ -0,0 +1,174 @@ +/* + * $Id: awk_cp.h,v 1.1 2006-12-09 11:50:08 bacon Exp $ + */ + +#ifndef _AWK_CP_H_ +#define _AWK_CP_H_ + +/*#import "C:\projects\ase\debug\win32\vs60\aseawk.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids*/ + +template +class CProxyIAwkEvents : public IConnectionPointImpl +{ + //Warning this class may be recreated by the wizard. +public: + LONG Fire_OpenSource(LONG mode) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = mode; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.lVal; + + } + LONG Fire_CloseSource(LONG mode) + { + CComVariant varResult; + T* pT = static_cast(this); + int nConnectionIndex; + CComVariant* pvars = new CComVariant[1]; + int nConnections = m_vec.GetSize(); + + for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(nConnectionIndex); + pT->Unlock(); + IDispatch* pDispatch = reinterpret_cast(sp.p); + if (pDispatch != NULL) + { + VariantClear(&varResult); + pvars[0] = mode; + DISPPARAMS disp = { pvars, NULL, 1, 0 }; + pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL); + } + } + delete[] pvars; + return varResult.lVal; + + } + LONG Fire_ReadSource (IBuffer* buf) + { + T* pT = static_cast(this); + int i, nconns = m_vec.GetSize(); + CComVariant args[1], ret; + + for (i = 0; i < nconns; i++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(i); + pT->Unlock(); + + IDispatch* pDispatch = + reinterpret_cast(sp.p); + if (pDispatch == NULL) continue; + + VariantClear (&ret); + VariantClear (&args[0]); + + args[0] = (IUnknown*)buf; + + DISPPARAMS disp = { args, NULL, 1, 0 }; + HRESULT hr = pDispatch->Invoke ( + 0x3, IID_NULL, LOCALE_USER_DEFAULT, + DISPATCH_METHOD, &disp, &ret, NULL, NULL); + if (FAILED(hr)) + { + continue; + } + + if (ret.vt == VT_EMPTY) + { + /* probably, the handler has not been implemeted*/ + continue; + } + + hr = ret.ChangeType (VT_I4); + if (FAILED(hr)) + { + /* TODO: set the error code properly... */ + /* invalid value returned... */ + return -1; + } + + return ret.lVal; + } + + /* no event handler attached for the source code read. */ + /* TODO: set error code ... */ + return -1; + } + + LONG Fire_WriteSource (IBuffer* buf) + { + T* pT = static_cast(this); + int i, nconns = m_vec.GetSize(); + CComVariant args[1], ret; + + for (i = 0; i < nconns; i++) + { + pT->Lock(); + CComPtr sp = m_vec.GetAt(i); + pT->Unlock(); + + IDispatch* pDispatch = + reinterpret_cast(sp.p); + if (pDispatch == NULL) continue; + + VariantClear (&ret); + VariantClear (&args[0]); + + args[0] = (IUnknown*)buf; + + DISPPARAMS disp = { args, NULL, 1, 0 }; + HRESULT hr = pDispatch->Invoke ( + 0x4, IID_NULL, LOCALE_USER_DEFAULT, + DISPATCH_METHOD, &disp, &ret, NULL, NULL); + if (FAILED(hr)) + { + continue; + } + + if (ret.vt == VT_EMPTY) + { + /* probably, the handler has not been implemeted*/ + continue; + } + + hr = ret.ChangeType (VT_I4); + if (FAILED(hr)) + { + /* TODO: set the error code properly... */ + /* invalid value returned... */ + return -1; + } + + return ret.lVal; + } + + /* no event handler attached for the source code write. + * make the operation succeed by returning the reqested + * data length. */ + CComBSTR bstr; + buf->get_Value (&bstr); + return bstr.Length(); + } +}; +#endif diff --git a/ase/com/resource.h b/ase/com/resource.h new file mode 100644 index 00000000..90cb19be --- /dev/null +++ b/ase/com/resource.h @@ -0,0 +1,19 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by ase.rc +// +#define IDS_PROJNAME 100 +#define IDR_AWK 101 +#define IDR_AWKBUFFER 102 +#define IDR_AWKEXTIO 104 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 105 +#endif +#endif diff --git a/ase/com/stdafx.cpp b/ase/com/stdafx.cpp new file mode 100644 index 00000000..a5eea178 --- /dev/null +++ b/ase/com/stdafx.cpp @@ -0,0 +1,12 @@ +// stdafx.cpp : source file that includes just the standard includes +// stdafx.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +#ifdef _ATL_STATIC_REGISTRY +#include +#include +#endif + +#include diff --git a/ase/com/stdafx.h b/ase/com/stdafx.h new file mode 100644 index 00000000..c7a5287f --- /dev/null +++ b/ase/com/stdafx.h @@ -0,0 +1,27 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#if !defined(AFX_STDAFX_H__D5DBF84D_6B4D_4C38_AD19_6B4208C02215__INCLUDED_) +#define AFX_STDAFX_H__D5DBF84D_6B4D_4C38_AD19_6B4208C02215__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define STRICT +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0400 +#endif +#define _ATL_APARTMENT_THREADED + +#include +//You may derive a class from CComModule and use it if you want to override +//something, but do not change the name of _Module +extern CComModule _Module; +#include + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__D5DBF84D_6B4D_4C38_AD19_6B4208C02215__INCLUDED)