summaryrefslogtreecommitdiff
path: root/comIvy/Expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'comIvy/Expression.cpp')
-rw-r--r--comIvy/Expression.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/comIvy/Expression.cpp b/comIvy/Expression.cpp
new file mode 100644
index 0000000..9287bae
--- /dev/null
+++ b/comIvy/Expression.cpp
@@ -0,0 +1,82 @@
+// Expression.cpp : implémentation de CExpression
+
+#include "stdafx.h"
+#include "Bus.h"
+#include "Ivy.h"
+#include "IvyApplication.h"
+
+#include "Expression.h"
+
+
+char * ConvBSTR( BSTR str );
+BSTR ConvCSTR( const char *str );
+
+// CExpression
+STDMETHODIMP CExpression::Bind(char* regex, CBus* _bus)
+{
+ if ( !_bus ) return E_FAIL;
+ bus = _bus;
+ bus->AddRef();
+ if ( id != -1 )
+ return E_FAIL;
+ if ( bus->bus )
+ id = bus->bus->BindMsg( regex, this );
+ else return E_FAIL;
+ return S_OK;
+}
+
+STDMETHODIMP CExpression::Unbind(void)
+{
+ if ( !bus ) return E_FAIL;
+ if ( bus->bus && id != -1 )
+ {
+ bus->bus->UnbindMsg( id );
+ id = -1;
+ }
+ else return E_FAIL;
+ bus->Release();
+ return S_OK;
+}
+
+void CExpression::OnMessage(IvyApplication * app, int argc, const char ** argv)
+{
+ BSTR appname = ConvCSTR( app->GetName() );
+ SAFEARRAY *pArrayVal = NULL;
+ HRESULT hr = S_OK;
+ // pour assurer la compatibilite avec VBSCript pouah horreur
+ //Create the safe array for the arguments string.
+ pArrayVal = SafeArrayCreateVector( VT_VARIANT, 0, argc );
+
+ if (!(pArrayVal == NULL) )
+ {
+ // Set the values for each element of the array
+ for( long i = 0 ; i < argc && SUCCEEDED( hr );i++)
+ {
+ hr = SafeArrayPutElement(pArrayVal, &i, new CComVariant(ConvCSTR(argv[i])));
+ }
+
+ }
+ VARIANT args;
+ args.vt = VT_ARRAY | VT_VARIANT;
+ V_ARRAY(&args) = pArrayVal;
+
+ Received( appname, args );
+
+ SafeArrayDestroy(pArrayVal);
+}
+
+// CExpression
+CExpression::CExpression()
+{
+ id = -1;
+ bus = 0;
+ ATLTRACE("CExpression created\n");
+}
+CExpression::~CExpression()
+{
+ if ( id != -1 )
+ Unbind();
+ id = -1;
+ bus = 0;
+ ATLTRACE("CExpression destroyed\n");
+}