comet-cpp 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/comet-html +69 -0
- data/bin/comet-make +53 -0
- data/bin/comet-new +62 -0
- data/bin/comet-web +14 -0
- data/lib/comet-html/generator.rb +220 -0
- data/lib/comet-html/header-generator.rb +145 -0
- data/lib/comet-html/parser-binding.rb +42 -0
- data/lib/comet-html/parser-class.rb +168 -0
- data/lib/comet-html/parser-context.rb +61 -0
- data/lib/comet-html/parser-reference.rb +98 -0
- data/lib/comet-html/parser-repeater.rb +58 -0
- data/lib/comet-html/parser-slot.rb +108 -0
- data/lib/comet-html/source-generator.rb +285 -0
- data/lib/comet-html/utils.rb +88 -0
- data/lib/guard/comet-html.rb +32 -0
- data/lib/guard/comet.rb +36 -0
- data/vendor/project/Gemfile +4 -0
- data/vendor/project/Guardfile +5 -0
- data/vendor/project/app/application.hpp +29 -0
- data/vendor/project/app/collections/.gitkeep +0 -0
- data/vendor/project/app/controllers/.gitkeep +0 -0
- data/vendor/project/app/main.cpp +6 -0
- data/vendor/project/app/models/.gitkeep +0 -0
- data/vendor/project/app/routes.cpp +7 -0
- data/vendor/project/app/views/layouts/.gitkeep +0 -0
- data/vendor/project/public/index.html +7 -0
- data/vendor/src/anchorable_element.hpp +79 -0
- data/vendor/src/append_semantics.hpp +73 -0
- data/vendor/src/bindable.cpp +99 -0
- data/vendor/src/bindable.hpp +106 -0
- data/vendor/src/cheerp_parse_cookie_values.cpp +58 -0
- data/vendor/src/comment_element.cpp +11 -0
- data/vendor/src/comment_element.hpp +17 -0
- data/vendor/src/cookies.cpp +94 -0
- data/vendor/src/cookies.hpp +60 -0
- data/vendor/src/custom_element.hpp +61 -0
- data/vendor/src/datatree.cpp +198 -0
- data/vendor/src/datatree.hpp +233 -0
- data/vendor/src/document.cpp +62 -0
- data/vendor/src/document.hpp +31 -0
- data/vendor/src/element.cpp +358 -0
- data/vendor/src/element.hpp +138 -0
- data/vendor/src/events.hpp +76 -0
- data/vendor/src/exception.cpp +13 -0
- data/vendor/src/exception.hpp +11 -0
- data/vendor/src/from_string.cpp +99 -0
- data/vendor/src/from_string.hpp +37 -0
- data/vendor/src/globals.cpp +6 -0
- data/vendor/src/globals.hpp +15 -0
- data/vendor/src/http.cpp +93 -0
- data/vendor/src/http.hpp +72 -0
- data/vendor/src/lexical_cast.hpp +51 -0
- data/vendor/src/local_storage.cpp +75 -0
- data/vendor/src/local_storage.hpp +53 -0
- data/vendor/src/mvc/collection.hpp +154 -0
- data/vendor/src/mvc/controller.hpp +59 -0
- data/vendor/src/mvc/id_type.hpp +9 -0
- data/vendor/src/mvc/layout.hpp +44 -0
- data/vendor/src/mvc/model.cpp +89 -0
- data/vendor/src/mvc/model.hpp +50 -0
- data/vendor/src/object.cpp +71 -0
- data/vendor/src/object.hpp +298 -0
- data/vendor/src/parse_cookie_values.hpp +12 -0
- data/vendor/src/promise.cpp +50 -0
- data/vendor/src/promise.hpp +43 -0
- data/vendor/src/repeater.hpp +116 -0
- data/vendor/src/router.cpp +62 -0
- data/vendor/src/router.hpp +34 -0
- data/vendor/src/router_base.hpp +107 -0
- data/vendor/src/signal.hpp +150 -0
- data/vendor/src/slot_element.hpp +61 -0
- data/vendor/src/url.cpp +19 -0
- data/vendor/src/url.hpp +15 -0
- data/vendor/src/window.cpp +22 -0
- data/vendor/src/window.hpp +24 -0
- metadata +134 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
#ifndef FRONT_LOCAL_STORAGE_HPP
|
2
|
+
# define FRONT_LOCAL_STORAGE_HPP
|
3
|
+
|
4
|
+
# include "from_string.hpp"
|
5
|
+
# include "signal.hpp"
|
6
|
+
# include <cheerp/clientlib.h>
|
7
|
+
|
8
|
+
namespace Comet
|
9
|
+
{
|
10
|
+
class LocalStorage
|
11
|
+
{
|
12
|
+
public:
|
13
|
+
LocalStorage();
|
14
|
+
LocalStorage(client::Storage*);
|
15
|
+
~LocalStorage();
|
16
|
+
|
17
|
+
struct Change
|
18
|
+
{
|
19
|
+
Change(client::StorageEvent*);
|
20
|
+
Change() {}
|
21
|
+
std::string key, old_value, new_value;
|
22
|
+
};
|
23
|
+
|
24
|
+
Signal<Change> on_change;
|
25
|
+
|
26
|
+
template<typename T>
|
27
|
+
void set_item(const std::string& key, T value)
|
28
|
+
{
|
29
|
+
set_item<const std::string&>(key, std::to_string(value));
|
30
|
+
}
|
31
|
+
|
32
|
+
template<typename T>
|
33
|
+
T get_item(const std::string& key) const
|
34
|
+
{
|
35
|
+
return Comet::from_string<T>(get_item<std::string>(key));
|
36
|
+
}
|
37
|
+
|
38
|
+
void remove_item(const std::string& key);
|
39
|
+
void clear();
|
40
|
+
|
41
|
+
private:
|
42
|
+
void initialize();
|
43
|
+
|
44
|
+
client::Storage* storage;
|
45
|
+
client::EventListener* event_listener;
|
46
|
+
};
|
47
|
+
|
48
|
+
template<> void LocalStorage::set_item<const std::string&>(const std::string& key, const std::string& value);
|
49
|
+
template<> void LocalStorage::set_item<std::string>(const std::string& key, std::string value);
|
50
|
+
template<> std::string LocalStorage::get_item<std::string>(const std::string& key) const;
|
51
|
+
}
|
52
|
+
|
53
|
+
#endif
|
@@ -0,0 +1,154 @@
|
|
1
|
+
#ifndef COMET_MVC_COLLECTION_HPP
|
2
|
+
# define COMET_MVC_COLLECTION_HPP
|
3
|
+
|
4
|
+
# include "../signal.hpp"
|
5
|
+
# include "../http.hpp"
|
6
|
+
# include "../datatree.hpp"
|
7
|
+
# include "model.hpp"
|
8
|
+
# include <map>
|
9
|
+
# include <list>
|
10
|
+
|
11
|
+
namespace Comet
|
12
|
+
{
|
13
|
+
template<typename MODEL>
|
14
|
+
class Collection : public Listener
|
15
|
+
{
|
16
|
+
typedef std::shared_ptr<MODEL> ModelPtr;
|
17
|
+
typedef std::map<typename MODEL::id_type, ModelPtr> Map;
|
18
|
+
public:
|
19
|
+
typedef MODEL Model;
|
20
|
+
|
21
|
+
Signal<MODEL&> added;
|
22
|
+
Signal<MODEL&> removed;
|
23
|
+
Signal<MODEL&> changed;
|
24
|
+
Signal<void> synced;
|
25
|
+
|
26
|
+
virtual std::string get_url() const = 0;
|
27
|
+
virtual std::string get_mimetype() const = 0;
|
28
|
+
|
29
|
+
void add(ModelPtr model)
|
30
|
+
{
|
31
|
+
auto it = models.at(model->get_id());
|
32
|
+
|
33
|
+
if (it == models.end())
|
34
|
+
{
|
35
|
+
models.emplace(model->get_id(), model);
|
36
|
+
added.trigger(*model);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
void remove(ModelPtr model)
|
41
|
+
{
|
42
|
+
auto it = models.at(model->get_id());
|
43
|
+
|
44
|
+
if (it != models.end())
|
45
|
+
{
|
46
|
+
models.erase(it);
|
47
|
+
removed.trigger(*model);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
void each(std::function<void (ModelPtr)> callback)
|
52
|
+
{
|
53
|
+
for (auto item : models)
|
54
|
+
callback(item.second);
|
55
|
+
}
|
56
|
+
|
57
|
+
std::list<ModelPtr> where(std::function<bool (ModelPtr)> selector) const
|
58
|
+
{
|
59
|
+
std::list<ModelPtr> results;
|
60
|
+
|
61
|
+
for (auto item : models)
|
62
|
+
{
|
63
|
+
if (selector(item.second))
|
64
|
+
results.push_back(item.second);
|
65
|
+
}
|
66
|
+
return results;
|
67
|
+
}
|
68
|
+
|
69
|
+
ModelPtr find(std::function<bool (ModelPtr)> selector) const
|
70
|
+
{
|
71
|
+
for (auto item : models)
|
72
|
+
{
|
73
|
+
if (selector(item.second))
|
74
|
+
return item.second;
|
75
|
+
}
|
76
|
+
return nullptr;
|
77
|
+
}
|
78
|
+
|
79
|
+
ModelPtr get(typename MODEL::id_type id)
|
80
|
+
{
|
81
|
+
auto it = models.find(id);
|
82
|
+
|
83
|
+
if (it != models.end())
|
84
|
+
return it->second;
|
85
|
+
return nullptr;
|
86
|
+
}
|
87
|
+
|
88
|
+
Promise fetch()
|
89
|
+
{
|
90
|
+
auto request = Http::Request::get(get_url());
|
91
|
+
|
92
|
+
request->set_headers({{"Accept", get_mimetype()}});
|
93
|
+
return request->send().then([this, request]()
|
94
|
+
{
|
95
|
+
auto response = request->get_response();
|
96
|
+
|
97
|
+
if (response->ok())
|
98
|
+
{
|
99
|
+
if (response->has_body())
|
100
|
+
parse(response->get_response_text());
|
101
|
+
synced.trigger();
|
102
|
+
}
|
103
|
+
});
|
104
|
+
}
|
105
|
+
|
106
|
+
unsigned int count() const
|
107
|
+
{
|
108
|
+
return models.size();
|
109
|
+
}
|
110
|
+
|
111
|
+
protected:
|
112
|
+
virtual void parse(const std::string& str) = 0;
|
113
|
+
|
114
|
+
Map models;
|
115
|
+
};
|
116
|
+
|
117
|
+
template<typename MODEL>
|
118
|
+
class JsonCollection : public Collection<MODEL>
|
119
|
+
{
|
120
|
+
public:
|
121
|
+
virtual std::string get_mimetype() const
|
122
|
+
{
|
123
|
+
return "application/json";
|
124
|
+
}
|
125
|
+
|
126
|
+
virtual std::string get_resource_name() const
|
127
|
+
{
|
128
|
+
return "";
|
129
|
+
}
|
130
|
+
|
131
|
+
protected:
|
132
|
+
virtual void parse(const std::string& str)
|
133
|
+
{
|
134
|
+
DataTree payload;
|
135
|
+
Data models_json;
|
136
|
+
const auto resource_name = get_resource_name();
|
137
|
+
|
138
|
+
payload.from_json(str);
|
139
|
+
if (resource_name.length() == 0)
|
140
|
+
models_json = payload.as_data();
|
141
|
+
else
|
142
|
+
models_json = payload[resource_name];
|
143
|
+
models_json.each([this](Data model_json) -> bool
|
144
|
+
{
|
145
|
+
auto ptr = std::make_shared<MODEL>();
|
146
|
+
ptr->from_json(model_json);
|
147
|
+
Collection<MODEL>::models.emplace(ptr->get_id(), ptr);
|
148
|
+
return true;
|
149
|
+
});
|
150
|
+
}
|
151
|
+
};
|
152
|
+
}
|
153
|
+
|
154
|
+
#endif
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#ifndef COMET_MVC_CONTROLLER_HPP
|
2
|
+
# define COMET_MVC_CONTROLLER_HPP
|
3
|
+
|
4
|
+
# include "../promise.hpp"
|
5
|
+
# include "../http.hpp"
|
6
|
+
# include "../router.hpp"
|
7
|
+
# include "layout.hpp"
|
8
|
+
|
9
|
+
# define match_route(ROUTE, CONTROLLER, METHOD) \
|
10
|
+
match(ROUTE, [](const Params& p) \
|
11
|
+
{ \
|
12
|
+
auto* controller = new CONTROLLER(p); \
|
13
|
+
controller->initialize().then([controller]() \
|
14
|
+
{ \
|
15
|
+
controller->METHOD(); \
|
16
|
+
controller->finalize().then([controller]() { delete controller; }); \
|
17
|
+
}); \
|
18
|
+
});
|
19
|
+
|
20
|
+
namespace Comet
|
21
|
+
{
|
22
|
+
class Controller
|
23
|
+
{
|
24
|
+
protected:
|
25
|
+
const Params& params;
|
26
|
+
|
27
|
+
public:
|
28
|
+
Controller(const Params& p) : params(p)
|
29
|
+
{
|
30
|
+
}
|
31
|
+
|
32
|
+
virtual std::string get_application_name()
|
33
|
+
{
|
34
|
+
return "main";
|
35
|
+
}
|
36
|
+
|
37
|
+
template<typename ELEMENT>
|
38
|
+
Layout<ELEMENT>& use_layout()
|
39
|
+
{
|
40
|
+
auto& layout = get_layout<ELEMENT>();
|
41
|
+
|
42
|
+
layout.attach_as_layout(get_application_name());
|
43
|
+
return layout;
|
44
|
+
}
|
45
|
+
|
46
|
+
template<typename ELEMENT>
|
47
|
+
Layout<ELEMENT>& get_layout()
|
48
|
+
{
|
49
|
+
static Layout<ELEMENT> layout;
|
50
|
+
|
51
|
+
return layout;
|
52
|
+
}
|
53
|
+
|
54
|
+
Comet::Promise initialize() { return Promise::solved_promise(); }
|
55
|
+
Comet::Promise finalize() { return Promise::solved_promise(); }
|
56
|
+
};
|
57
|
+
}
|
58
|
+
|
59
|
+
#endif
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#ifndef COMET_MVC_LAYOUT_HPP
|
2
|
+
# define COMET_MVC_LAYOUT_HPP
|
3
|
+
|
4
|
+
# include "../globals.hpp"
|
5
|
+
# include "../exception.hpp"
|
6
|
+
|
7
|
+
namespace Comet
|
8
|
+
{
|
9
|
+
template<typename ELEMENT>
|
10
|
+
class Layout : public ELEMENT
|
11
|
+
{
|
12
|
+
Element get_container(const std::string& application_name)
|
13
|
+
{
|
14
|
+
auto candidates = body.find("[comet-app='" + application_name + "']");
|
15
|
+
|
16
|
+
if (candidates.size() > 0)
|
17
|
+
return candidates[0];
|
18
|
+
return body;
|
19
|
+
}
|
20
|
+
|
21
|
+
public:
|
22
|
+
void attach_as_layout(const std::string& application_name)
|
23
|
+
{
|
24
|
+
auto container = get_container(application_name);
|
25
|
+
|
26
|
+
if (container.is_undefined())
|
27
|
+
raise(std::runtime_error("Could not find the application container element"));
|
28
|
+
container.empty();
|
29
|
+
ELEMENT::append_to(container);
|
30
|
+
ELEMENT::bind_attributes();
|
31
|
+
ELEMENT::trigger_binding_updates();
|
32
|
+
}
|
33
|
+
|
34
|
+
template<typename VIEW_ELEMENT>
|
35
|
+
void render(std::shared_ptr<VIEW_ELEMENT> el)
|
36
|
+
{
|
37
|
+
ELEMENT::slot_content.set_element(el);
|
38
|
+
ELEMENT::bind_attributes();
|
39
|
+
ELEMENT::trigger_binding_updates();
|
40
|
+
}
|
41
|
+
};
|
42
|
+
}
|
43
|
+
|
44
|
+
#endif
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#include "model.hpp"
|
2
|
+
#include "../http.hpp"
|
3
|
+
|
4
|
+
using namespace Comet;
|
5
|
+
using namespace std;
|
6
|
+
|
7
|
+
Comet::Promise Model::fetch()
|
8
|
+
{
|
9
|
+
auto request = Http::Request::get(get_url());
|
10
|
+
|
11
|
+
request->set_headers({{"Accept", get_content_type()}});
|
12
|
+
return request->send().then([this, request]()
|
13
|
+
{
|
14
|
+
auto response = request->get_response();
|
15
|
+
|
16
|
+
if (response->ok())
|
17
|
+
{
|
18
|
+
if (response->has_body())
|
19
|
+
parse(response->get_response_text());
|
20
|
+
synced.trigger();
|
21
|
+
}
|
22
|
+
});
|
23
|
+
}
|
24
|
+
|
25
|
+
Comet::Promise Model::save()
|
26
|
+
{
|
27
|
+
auto request = Http::Request::make(get_id() == COMET_MVC_NULL_ID ? "post" : "put", get_url());
|
28
|
+
|
29
|
+
request->set_headers({
|
30
|
+
{"Content-Type", get_content_type()},
|
31
|
+
{"Accept", get_content_type()}
|
32
|
+
});
|
33
|
+
request->set_body(get_payload());
|
34
|
+
return request->send().then([this, request]()
|
35
|
+
{
|
36
|
+
auto response = request->get_response();
|
37
|
+
|
38
|
+
if (response->ok())
|
39
|
+
{
|
40
|
+
if (response->has_body())
|
41
|
+
parse(response->get_response_text());
|
42
|
+
synced.trigger();
|
43
|
+
}
|
44
|
+
});
|
45
|
+
}
|
46
|
+
|
47
|
+
Comet::Promise Model::destroy(Comet::HttpResponseCallback callback)
|
48
|
+
{
|
49
|
+
auto request = Http::Request::_delete(get_url());
|
50
|
+
|
51
|
+
request->set_headers({{"Accept", get_content_type()}});
|
52
|
+
return request->send().then([this, request, callback]()
|
53
|
+
{
|
54
|
+
auto response = request->get_response();
|
55
|
+
|
56
|
+
if (response->ok())
|
57
|
+
removed.trigger();
|
58
|
+
if (callback)
|
59
|
+
callback(response);
|
60
|
+
});
|
61
|
+
}
|
62
|
+
|
63
|
+
std::string JsonModel::get_payload()
|
64
|
+
{
|
65
|
+
if (get_resource_name().length() > 0)
|
66
|
+
{
|
67
|
+
std::stringstream stream;
|
68
|
+
stream << '{' << '"' << get_resource_name() << '"' << ':' << to_json() << '}';
|
69
|
+
|
70
|
+
return stream.str();
|
71
|
+
}
|
72
|
+
return to_json();
|
73
|
+
}
|
74
|
+
|
75
|
+
void JsonModel::parse(const std::string& str)
|
76
|
+
{
|
77
|
+
DataTree data;
|
78
|
+
|
79
|
+
data.from_json(str);
|
80
|
+
if (get_resource_name().length() > 0 && data[get_resource_name()].exists())
|
81
|
+
from_json(data[get_resource_name()]);
|
82
|
+
else
|
83
|
+
from_json(data);
|
84
|
+
}
|
85
|
+
|
86
|
+
std::string JsonModel::get_content_type() const
|
87
|
+
{
|
88
|
+
return "application/json";
|
89
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#ifndef COMET_MVC_MODEL_HPP
|
2
|
+
# define COMET_MVC_MODEL_HPP
|
3
|
+
|
4
|
+
# include "../signal.hpp"
|
5
|
+
# include "../promise.hpp"
|
6
|
+
# include "../datatree.hpp"
|
7
|
+
# include "id_type.hpp"
|
8
|
+
|
9
|
+
namespace Comet
|
10
|
+
{
|
11
|
+
namespace Http { class Response; }
|
12
|
+
typedef std::function<void (std::shared_ptr<Http::Response>)> HttpResponseCallback;
|
13
|
+
|
14
|
+
class Model : public Listener
|
15
|
+
{
|
16
|
+
public:
|
17
|
+
typedef COMET_MVC_ID_TYPE id_type;
|
18
|
+
|
19
|
+
Signal<void> removed;
|
20
|
+
Signal<void> synced;
|
21
|
+
|
22
|
+
virtual id_type get_id() const { return id; }
|
23
|
+
virtual std::string get_url() const = 0;
|
24
|
+
virtual std::string get_resource_name() const { return ""; }
|
25
|
+
|
26
|
+
Promise fetch();
|
27
|
+
Promise save();
|
28
|
+
Promise destroy(HttpResponseCallback callback = HttpResponseCallback());
|
29
|
+
virtual void parse(const std::string& str) = 0;
|
30
|
+
|
31
|
+
protected:
|
32
|
+
virtual std::string get_payload() = 0;
|
33
|
+
virtual std::string get_content_type() const = 0;
|
34
|
+
|
35
|
+
id_type id = COMET_MVC_NULL_ID;
|
36
|
+
};
|
37
|
+
|
38
|
+
class JsonModel : public Model
|
39
|
+
{
|
40
|
+
public:
|
41
|
+
virtual void from_json(Data) = 0;
|
42
|
+
virtual std::string to_json() const = 0;
|
43
|
+
void parse(const std::string& str);
|
44
|
+
protected:
|
45
|
+
std::string get_payload();
|
46
|
+
std::string get_content_type() const;
|
47
|
+
};
|
48
|
+
}
|
49
|
+
|
50
|
+
#endif
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#include "object.hpp"
|
2
|
+
#include "globals.hpp"
|
3
|
+
|
4
|
+
using namespace Comet;
|
5
|
+
using namespace std;
|
6
|
+
|
7
|
+
static void prepare_is_undefined()
|
8
|
+
{
|
9
|
+
static bool is_prepared = false;
|
10
|
+
|
11
|
+
if (!is_prepared)
|
12
|
+
{
|
13
|
+
client::eval("window.isUndefined = function(a) { return a == undefined ? 'y' : 'n'; };");
|
14
|
+
is_prepared = true;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
bool Object::is_of_type(const char* type) const
|
19
|
+
{
|
20
|
+
if (is_undefined())
|
21
|
+
return false;
|
22
|
+
return ptr->operator[]("constructor") == *(window[type]);
|
23
|
+
}
|
24
|
+
|
25
|
+
bool Object::is_undefined() const
|
26
|
+
{
|
27
|
+
prepare_is_undefined();
|
28
|
+
if (ptr != nullptr)
|
29
|
+
{
|
30
|
+
Object answer = window.apply("isUndefined", *this);
|
31
|
+
std::string result = (std::string)(*static_cast<client::String*>(answer.ptr));
|
32
|
+
return result == "y";
|
33
|
+
}
|
34
|
+
return true;
|
35
|
+
}
|
36
|
+
|
37
|
+
void Object::set_global(const std::string& key, Object object)
|
38
|
+
{
|
39
|
+
window.set(key, object);
|
40
|
+
}
|
41
|
+
|
42
|
+
template<>
|
43
|
+
vector<wstring> Object::to_vector() const
|
44
|
+
{
|
45
|
+
vector<wstring> result;
|
46
|
+
|
47
|
+
if (is_of_type("Array"))
|
48
|
+
{
|
49
|
+
const client::Array& array = *(static_cast<client::Array*>(ptr));
|
50
|
+
result.resize(array.get_length());
|
51
|
+
for (int i = 0 ; i < array.get_length() ; ++i)
|
52
|
+
result.push_back((wstring)(Object(array[i])));
|
53
|
+
}
|
54
|
+
return result;
|
55
|
+
}
|
56
|
+
|
57
|
+
namespace Comet
|
58
|
+
{
|
59
|
+
std::wstring to_wstring(client::String* value)
|
60
|
+
{
|
61
|
+
std::wstring wide_string;
|
62
|
+
auto length = value->get_length();
|
63
|
+
wchar_t* result = new wchar_t[length + 1];
|
64
|
+
|
65
|
+
for(int i = 0; i < value->get_length() ; i++)
|
66
|
+
result[i] = (wchar_t)value->charCodeAt(i);
|
67
|
+
wide_string = std::wstring(result, length);
|
68
|
+
delete[] result;
|
69
|
+
return wide_string;
|
70
|
+
}
|
71
|
+
}
|