diff --git a/ase/com/Awk.cpp b/ase/com/Awk.cpp index 86eba4c8..c8800e18 100644 --- a/ase/com/Awk.cpp +++ b/ase/com/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.2 2006-12-09 17:36:27 bacon Exp $ + * $Id: Awk.cpp,v 1.3 2006-12-10 05:59:52 bacon Exp $ */ #include "stdafx.h" @@ -172,12 +172,9 @@ static ase_ssize_t __read_source ( } else if (cmd == ASE_AWK_IO_READ) { - HRESULT hr; - CComBSTR val; - if (awk->read_source_buf == NULL) { - hr = CoCreateInstance ( + HRESULT hr = CoCreateInstance ( CLSID_Buffer, NULL, CLSCTX_ALL, IID_IBuffer, (void**)&awk->read_source_buf); if (FAILED(hr)) @@ -190,30 +187,35 @@ MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); awk->read_source_len = 0; } + CBuffer* tmp = (CBuffer*)awk->read_source_buf; + if (awk->read_source_pos >= awk->read_source_len) { INT 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 > (INT)val.Length()) return -1; + //if (n > (INT)tmp->str.Length()) return -1; + if (n > (INT)SysStringLen(tmp->str)) return -1; awk->read_source_pos = 0; awk->read_source_len = n; } - else + + BSTR str = tmp->str; + if (str == NULL) { - awk->read_source_buf->get_Value (&val); + /* it can't be emptry here ... */ + return -1; } ASE_AWK_ASSERT (awk->handle, awk->read_source_pos < awk->read_source_len); + INT left = awk->read_source_len - awk->read_source_pos; if (left > (ase_ssize_t)count) { memcpy (data, - ((TCHAR*)(BSTR)val)+awk->read_source_pos, + ((TCHAR*)str)+awk->read_source_pos, count * ASE_SIZEOF(ase_char_t)); awk->read_source_pos += count; return count; @@ -221,7 +223,7 @@ MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); else { memcpy (data, - ((TCHAR*)(BSTR)val)+awk->read_source_pos, + ((TCHAR*)str)+awk->read_source_pos, left * ASE_SIZEOF(ase_char_t)); awk->read_source_pos = 0; awk->read_source_len = 0; @@ -229,7 +231,6 @@ MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); } } - return -1; } @@ -262,9 +263,18 @@ MessageBox (NULL, _T("COCREATEINSTANCE FAILED"), _T("FUCK"), MB_OK); } } - awk->write_source_buf->put_Value (CComBSTR(count,data)); - INT n = awk->Fire_WriteSource (awk->write_source_buf); + BSTR bstr = SysAllocStringLen (data, count); + if (bstr == NULL) return -1; /* TODO: bettter error handling */ + hr = awk->write_source_buf->put_Value (bstr); +SysFreeString (bstr); + if (FAILED(hr)) + { +//SysFreeString (bstr); + return -1; + } + + INT n = awk->Fire_WriteSource (awk->write_source_buf); if (n > (INT)count) return -1; return (ase_ssize_t)n; } @@ -360,8 +370,16 @@ static ase_ssize_t __process_extio ( IID_IAwkExtio, (void**)&extio); if (FAILED(hr)) return -1; /* TODO: better error handling.. */ + BSTR bstr = SysAllocString (epa->name); + if (bstr == NULL) + { + extio->Release (); + return -1; /* TODO: better error handling */ + } + extio2 = (CAwkExtio*)extio; - extio2->name = epa->name; + extio2->name.Empty (); + extio2->name.Attach (bstr); extio2->type = epa->type & 0xFF; extio2->mode = epa->mode; VariantClear (&extio2->handle); @@ -410,18 +428,29 @@ static ase_ssize_t __process_extio ( } else if (cmd == ASE_AWK_IO_WRITE) { + HRESULT hr; IAwkExtio* extio = (IAwkExtio*)epa->handle; ASE_AWK_ASSERT (ase_awk_getrunawk(epa->run), extio != NULL); if (awk->write_extio_buf == NULL) { - HRESULT hr = CoCreateInstance ( + hr = CoCreateInstance ( CLSID_Buffer, NULL, CLSCTX_ALL, IID_IBuffer, (void**)&awk->write_extio_buf); if (FAILED(hr)) return -1; } - awk->write_extio_buf->put_Value (CComBSTR(size,data)); + BSTR bstr = SysAllocStringLen (data, size); + if (bstr == NULL) return -1; /* TODO: error code */ + + hr = awk->write_extio_buf->put_Value (bstr); +SysFreeString (bstr); + if (FAILED(hr)) + { +// SysFreeString (bstr); + return -1; + } + INT n = awk->Fire_WriteExtio (extio, awk->write_extio_buf); if (n > (INT)size) return -1; return (ase_ssize_t)n; diff --git a/ase/com/Buffer.cpp b/ase/com/Buffer.cpp index 34a43abc..19fa1950 100644 --- a/ase/com/Buffer.cpp +++ b/ase/com/Buffer.cpp @@ -1,5 +1,5 @@ /* - * $Id: Buffer.cpp,v 1.2 2006-12-09 17:36:27 bacon Exp $ + * $Id: Buffer.cpp,v 1.3 2006-12-10 05:59:52 bacon Exp $ */ #include "stdafx.h" @@ -12,6 +12,7 @@ CBuffer::CBuffer () _sntprintf (x, 128, _T("CBuffer::CBuffer %p"), this); MessageBox (NULL, x, x, MB_OK); #endif + str = NULL; } CBuffer::~CBuffer () @@ -21,16 +22,32 @@ CBuffer::~CBuffer () _sntprintf (x, 128, _T("CBuffer::~CBuffer %p"), this); MessageBox (NULL, x, x, MB_OK); #endif + if (str != NULL) SysFreeString (str); } -STDMETHODIMP CBuffer::get_Value(BSTR *pVal) +STDMETHODIMP CBuffer::get_Value (BSTR *pVal) { - *pVal = str; + if (str == NULL) *pVal = NULL; + else + { + BSTR tmp = SysAllocStringLen(str, SysStringLen(str)); + if (tmp == NULL) return E_OUTOFMEMORY; + *pVal = tmp; + } + return S_OK; } -STDMETHODIMP CBuffer::put_Value(BSTR newVal) +STDMETHODIMP CBuffer::put_Value (BSTR newVal) { - str = newVal; + + if (str != NULL) SysFreeString (str); + if (newVal == NULL) str = newVal; + else + { + str = SysAllocStringLen (newVal, SysStringLen(newVal)); + if (str == NULL) return E_OUTOFMEMORY; + } + return S_OK; } diff --git a/ase/com/Buffer.h b/ase/com/Buffer.h index 8d75ff43..86352b41 100644 --- a/ase/com/Buffer.h +++ b/ase/com/Buffer.h @@ -1,5 +1,5 @@ /* - * $Id: Buffer.h,v 1.2 2006-12-09 11:57:40 bacon Exp $ + * $Id: Buffer.h,v 1.3 2006-12-10 05:59:52 bacon Exp $ */ #ifndef _ASE_COM_BUFFER_H_ @@ -13,8 +13,9 @@ class ATL_NO_VTABLE CBuffer : public CComCoClass, public IDispatchImpl { -private: - CComBSTR str; +public: + //CComBSTR str; + BSTR str; public: CBuffer ();