4
* Copyright Ericsson AB 2008-2009. All Rights Reserved.
6
* The contents of this file are subject to the Erlang Public License,
7
* Version 1.1, (the "License"); you may not use this file except in
8
* compliance with the License. You should have received a copy of the
9
* Erlang Public License along with this software. If not, it can be
10
* retrieved online at http://www.erlang.org/.
12
* Software distributed under the License is distributed on an "AS IS"
13
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
* the License for the specific language governing rights and limitations
20
#include "wxe_return.h"
22
// see http://docs.wxwidgets.org/stable/wx_wxarray.html#arraymacros
23
// this is a magic incantation which must be done!
24
#include <wx/arrimpl.cpp>
25
WX_DEFINE_OBJARRAY(wxErlDrvTermDataArray);
29
wxeReturn::wxeReturn (ErlDrvPort _port,
30
ErlDrvTermData _caller,
38
addAtom("_wxe_result_");
42
wxeReturn::~wxeReturn () {
43
//depending on which version of wxArray we use, we may have to clear it ourselves.
46
int wxeReturn::send() {
47
if ((rt.GetCount() == 2 && isResult) || rt.GetCount() == 0)
48
return 1; // not a call bail out
55
unsigned int rtLength = rt.GetCount(); //signed int
57
size_t size = sizeof(ErlDrvTermData)*(rtLength);
59
ErlDrvTermData* rtData = (ErlDrvTermData *) driver_alloc(size);
60
for (unsigned int i=0; i < rtLength; i++) {
64
int res = driver_send_term(port, caller, rtData, rtLength);
69
msg.Printf(wxT("Failed to send return or event msg"));
70
send_msg("internal_error", &msg);
76
//clear everything so we can re-use if we want
77
void wxeReturn::reset() {
83
unsigned int wxeReturn::size() {
88
void wxeReturn::add(ErlDrvTermData type, ErlDrvTermData data) {
95
// void wxeReturn::addRef(const void *ptr, const char* className) {
96
// unsigned int ref_idx = wxe_app->getRef((void *)ptr, memEnv);
97
// addRef(ref_idx, className);
101
void wxeReturn::addRef(const unsigned int ref, const char* className) {
111
void wxeReturn::addAtom(const char* atomName) {
112
add(ERL_DRV_ATOM, driver_mk_atom((char *)atomName));
116
void wxeReturn::addBinary(const char* buf, const size_t size) {
117
rt.Add(ERL_DRV_BUF2BINARY);
118
rt.Add((ErlDrvTermData)buf);
119
rt.Add((ErlDrvTermData)size);
123
void wxeReturn::addExt2Term(wxeErlTerm *term) {
125
rt.Add(ERL_DRV_EXT2TERM);
126
rt.Add((ErlDrvTermData)term->bin);
127
rt.Add((ErlDrvTermData)term->size);
134
void wxeReturn::addExt2Term(wxETreeItemData *val) {
136
rt.Add(ERL_DRV_EXT2TERM);
137
rt.Add((ErlDrvTermData)(val->bin));
138
rt.Add((ErlDrvTermData)(val->size));
144
void wxeReturn::addUint(unsigned int n) {
145
add(ERL_DRV_UINT, (ErlDrvTermData)n);
149
void wxeReturn::addInt(int n) {
150
add(ERL_DRV_INT, (ErlDrvTermData)n);
154
void wxeReturn::addFloat(double f) {
155
// Erlang expects a pointer to double...
156
// Hmm is temp_float moved if reallocated
157
// the pointer may be wrong.
158
// Harryhuk - use a list instead?
160
add(ERL_DRV_FLOAT, (ErlDrvTermData)&temp_float.Last());
164
void wxeReturn::addTupleCount(unsigned int n) {
165
add(ERL_DRV_TUPLE, (ErlDrvTermData)n);
169
void wxeReturn::endList(unsigned int n) {
171
add(ERL_DRV_LIST, (ErlDrvTermData)(n+1));
175
void wxeReturn::addBool(int val) {
184
void wxeReturn::add(const wxString s) {
185
int strLen = s.Len();
186
wxCharBuffer resultCB = s.mb_str(utfConverter);
187
int * resultPtr = (int *) resultCB.data();
189
for (int i = 0; i < strLen; i++, resultPtr++) {
196
void wxeReturn::add(const wxString* s) {
201
void wxeReturn::add(wxArrayString val) {
202
unsigned int len = val.GetCount();
204
for (unsigned int i = 0; i< len; i++) {
211
void wxeReturn::add(wxArrayInt val) {
212
unsigned int len = val.GetCount();
214
for (unsigned int i = 0; i< len; i++) {
221
void wxeReturn::add(wxUIntPtr *val) {
222
addInt((ErlDrvTermData)val); // TODO is this right?
226
void wxeReturn::add(wxPoint pt) {
233
void wxeReturn::add(wxPoint2DDouble pt) {
240
void wxeReturn::add(wxSize size) {
241
addInt(size.GetWidth());
242
addInt(size.GetHeight());
247
void wxeReturn::add(wxRect rect) {
256
void wxeReturn::add(wxColour colour) {
257
addInt(colour.Red());
258
addInt(colour.Green());
259
addInt(colour.Blue());
260
addInt(colour.Alpha());
265
void wxeReturn::add(wxDateTime dateTime) {
272
void wxeReturn::addDate(wxDateTime dateTime) {
273
addInt(dateTime.GetYear());
274
addInt(dateTime.GetMonth()+1); // c++ month is zero based
275
addInt(dateTime.GetDay());
279
INLINE void wxeReturn::addTime(wxDateTime dateTime) {
280
addInt(dateTime.GetHour());
281
addInt(dateTime.GetMinute());
282
addInt(dateTime.GetSecond());
287
void wxeReturn::add(wxRect2DDouble rect2D) {
288
addFloat(rect2D.m_x);
289
addFloat(rect2D.m_y);
290
addFloat(rect2D.m_width);
291
addFloat(rect2D.m_height);
296
void wxeReturn::add(wxGridCellCoords val) {
297
addInt(val.GetRow());
298
addInt(val.GetCol());
303
void wxeReturn::add(wxGBPosition val) {
304
addInt(val.GetRow());
305
addInt(val.GetCol());
310
void wxeReturn::add(wxGBSpan val) {
311
addInt(val.GetRowspan());
312
addInt(val.GetColspan());
317
void wxeReturn::add(wxMouseState val) {
318
addAtom("wxMouseState");
322
addBool(val.LeftDown());
323
addBool(val.MiddleDown());
324
addBool(val.RightDown());
325
addBool(val.ControlDown());
326
addBool(val.ShiftDown());
327
addBool(val.AltDown());
328
addBool(val.MetaDown());
329
addBool(val.CmdDown());