-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrubywrapper.h
More file actions
157 lines (133 loc) · 4.9 KB
/
rubywrapper.h
File metadata and controls
157 lines (133 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* Copyright(c) 2000 arton
*
* You may distribute under the terms of either the GNU General Public
* License
*
* $Date: 2006-11-15 12:49:36 +0900 (æ°´, 15 11 2006) $
*/
#ifndef __RUBYWRAPPER_H_
#define __RUBYWRAPPER_H_
#include "resource.h" // ƒƒCƒ“ ƒVƒ“ƒ{ƒ‹
#include "giplip.h"
/////////////////////////////////////////////////////////////////////////////
// CRubyWrapper
class CScrError;
struct SInvokeParam;
struct STypeConvParam;
struct oledata;
struct OlePair
{
OlePair() : pole(NULL), module(0) {}
OlePair(oledata* p, VALUE m) : pole(p), module(m) {}
OlePair(const OlePair& r) : pole(r.pole), module(r.module) {}
struct oledata* pole;
VALUE module;
};
typedef std::list<OlePair> OleList;
typedef std::list<OlePair>::iterator OleListIter;
class ATL_NO_VTABLE CRubyWrapper :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CRubyWrapper, &CLSID_RubyWrapper>,
public IRubyWrapper
{
public:
CRubyWrapper() :
m_uiQuitTimer(0),
m_pCurrentEngine(NULL),
m_fTracing(false)
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_RUBYWRAPPER)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CRubyWrapper)
COM_INTERFACE_ENTRY(IRubyWrapper)
END_COM_MAP()
HRESULT FinalConstruct();
void FinalRelease();
// C++ object function
void Globalize();
void Unglobalize();
static IRubyWrapper* GetWrapper();
static CRubyWrapper* GetCWrapper();
bool ReleaseOle(oledata*);
void AddOle(VALUE, oledata*);
inline UINT GetTimerID() const { return m_uiQuitTimer; }
inline IRubyEngine* GetCurrentEngine() { return m_pCurrentEngine; }
inline void SetHandle(HANDLE h) { m_hThread = h; }
inline HANDLE GetHandle() const { return m_hThread; }
static ID s_idInstanceEval;
static ID s_idModuleEval;
// IRubyWrapper
public:
HRESULT STDMETHODCALLTYPE rb_intern(
/* [string][in] */ unsigned char __RPC_FAR *name,
/* [out] */ unsigned long __RPC_FAR *pid);
HRESULT STDMETHODCALLTYPE rb_module_new(
/* [in] */ unsigned long parent,
/* [out] */ unsigned long __RPC_FAR *p);
HRESULT STDMETHODCALLTYPE SearchMethod(
/* [in] */ unsigned long val,
/* [string][in] */ unsigned char __RPC_FAR *pName,
/* [out] */ DISPID __RPC_FAR *pDispID);
HRESULT STDMETHODCALLTYPE rb_invoke(
/* [in] */ IRubyEngine* pengine,
/* [in] */ unsigned long func,
/* [in] */ unsigned long module,
/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
/* [out] */ VARIANT __RPC_FAR *pVarResult,
/* [out] */ IActiveScriptError __RPC_FAR *__RPC_FAR *ppError);
HRESULT STDMETHODCALLTYPE SearchClass(
/* [string][in] */ unsigned char __RPC_FAR *pName,
/* [out] */ unsigned long __RPC_FAR *pval);
HRESULT STDMETHODCALLTYPE rb_funcall_with_string2(
/* [in] */ IRubyEngine __RPC_FAR *pengine,
/* [in] */ unsigned long val,
/* [in] */ unsigned long id,
/* [in] */ long line,
/* [in] */ long cb,
/* [size_is][in] */ unsigned char __RPC_FAR *p,
/* [in] */ boolean TraceRequired,
/* [out] */ VARIANT __RPC_FAR *pVarResult,
/* [out] */ IActiveScriptError __RPC_FAR *__RPC_FAR *ppError);
HRESULT STDMETHODCALLTYPE RegisterObject(
/* [string][in] */ unsigned char __RPC_FAR *pName,
/* [in] */ unsigned long Module);
HRESULT STDMETHODCALLTYPE UnregisterObject(
/* [string][in] */ unsigned char __RPC_FAR *pName,
/* [in] */ unsigned long Module);
HRESULT STDMETHODCALLTYPE Disconnect(
/* [in] */ IRubyEngine __RPC_FAR *pengine);
HRESULT STDMETHODCALLTYPE DefineGlobalObject(
/* [in] */ IRubyEngine __RPC_FAR *pengine);
HRESULT STDMETHODCALLTYPE DefineConstant(
/* [string][in] */ unsigned char __RPC_FAR *pName,
/* [in] */ unsigned long Module,
/* [in] */ VARIANT __RPC_FAR *pVar,
/* [in] */ IRubyEngine __RPC_FAR *pengine);
private:
UINT m_uiQuitTimer;
VALUE m_valList;
ID m_idEach;
ID m_idEachLine;
ID m_idSize;
ID m_idMethods;
ID m_idDelete;
OleList m_listOle;
static CRubyWrapper* s_pWrapper;
static GIP(IRubyWrapper) s_gip;
static VALUE CallRuby(VALUE val);
static IActiveScriptError* FetchErrorInfo(LPCSTR);
HANDLE m_hThread;
IRubyEngine* m_pCurrentEngine;
//
void GetValue(IRubyEngine *pengine, VALUE, VARIANT*, IActiveScriptError**);
void GetEnum(IRubyEngine *pengine, VALUE, VARIANT*, IActiveScriptError**);
static VALUE add_item(VALUE item, VALUE ary);
static VALUE add_lineitem(VALUE i, VALUE ary, int argc, VALUE *argv);
static VALUE InvokeRuby(VALUE pParam);
static VALUE val2var(VALUE pParam);
//
bool m_fTracing;
};
#endif //__RUBYWRAPPER_H_