Merge lp:~jamesh/go-unityscopes/new-activation-responses into lp:go-unityscopes/v2

Proposed by James Henstridge
Status: Merged
Merged at revision: 71
Proposed branch: lp:~jamesh/go-unityscopes/new-activation-responses
Merge into: lp:go-unityscopes/v2
Diff against target: 155 lines (+80/-3)
4 files modified
activationresponse.cpp (+22/-0)
activationresponse.go (+43/-3)
activationresponse_test.go (+13/-0)
shim.h (+2/-0)
To merge this branch: bzr merge lp:~jamesh/go-unityscopes/new-activation-responses
Reviewer Review Type Date Requested Status
Xavi Garcia (community) Approve
Review via email: mp+275522@code.launchpad.net

Description of the change

Add support for the UpdateResult and UpdatePreview activation response types.

To post a comment you must log in.
Revision history for this message
Xavi Garcia (xavi-garcia-mena) wrote :

I have compilation issues:
_______________________________________________________
./activationresponse.cpp: In function ‘void activation_response_init_update_result(_ActivationResponse*, _Result*)’:
./activationresponse.cpp:25:46: error: ‘Result’ was not declared in this scope
         ActivationResponse(*reinterpret_cast<Result*>(result));
                                              ^
./activationresponse.cpp:25:27: error: expected primary-expression before ‘(’ token
         ActivationResponse(*reinterpret_cast<Result*>(result));
                           ^
./activationresponse.cpp:25:46: error: ‘Result’ does not name a type
         ActivationResponse(*reinterpret_cast<Result*>(result));
                                              ^
./activationresponse.cpp:25:52: error: expected ‘>’ before ‘*’ token
         ActivationResponse(*reinterpret_cast<Result*>(result));
                                                    ^
./activationresponse.cpp:25:52: error: expected ‘(’ before ‘*’ token
./activationresponse.cpp:25:53: error: expected primary-expression before ‘>’ token
         ActivationResponse(*reinterpret_cast<Result*>(result));
                                                     ^
./activationresponse.cpp: In function ‘void activation_response_init_update_preview(_ActivationResponse*, void*, int, char**)’:
./activationresponse.cpp:31:9: error: ‘PreviewWidgetList’ was not declared in this scope
         PreviewWidgetList widgets;
         ^
./activationresponse.cpp:33:13: error: ‘widgets’ was not declared in this scope
             widgets.push_back(PreviewWidget(std::string(
             ^
./activationresponse.cpp:34:52: error: ‘PreviewWidget’ was not declared in this scope
                 widget_data[i].p, widget_data[i].n)));
                                                    ^
./activationresponse.cpp:37:32: error: ‘widgets’ was not declared in this scope
             ActivationResponse(widgets);
______________________________________________________________________

I have the following version of libunity-scopes-dev installed: 0.6.16+15.04.20150410.3-0ubuntu1

Could it be possible that we need to update the version.h file to indicate the right version of scopes-api to compile with?

review: Needs Information
73. By James Henstridge

Add extra includes.

Revision history for this message
James Henstridge (jamesh) wrote :

I just spun up a vivid + stable-phone-overlay LXC container, and had no problem building the package or running the tests.

It looks like I'm relying on incidental includes which likely weren't present in previous versions though, which is bad practice. So I've added #include directives for Result.h and PreviewWidget.h.

If you try this on Xenial and notice that things seem busted, this is due to some new checks found in Go 1.6 beta. This is being tracked in bug 1535157, but for now setting the environment variable GODEBUG=cgocheck=0 will fix things. A real fix will come later.

Revision history for this message
Xavi Garcia (xavi-garcia-mena) wrote :

Looks good to me. Thanks, James

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'activationresponse.cpp'
2--- activationresponse.cpp 2015-02-26 10:14:35 +0000
3+++ activationresponse.cpp 2016-02-03 07:18:51 +0000
4@@ -3,6 +3,8 @@
5
6 #include <unity/scopes/ActivationResponse.h>
7 #include <unity/scopes/CannedQuery.h>
8+#include <unity/scopes/PreviewWidget.h>
9+#include <unity/scopes/Result.h>
10
11 extern "C" {
12 #include "_cgo_export.h"
13@@ -20,6 +22,26 @@
14 ActivationResponse(*reinterpret_cast<CannedQuery*>(query));
15 }
16
17+void activation_response_init_update_result(_ActivationResponse *response, _Result *result) {
18+ *reinterpret_cast<ActivationResponse*>(response) =
19+ ActivationResponse(*reinterpret_cast<Result*>(result));
20+}
21+
22+void activation_response_init_update_preview(_ActivationResponse *response, void *gostring_array, int count, char **error) {
23+ try {
24+ GoString *widget_data = static_cast<GoString*>(gostring_array);
25+ PreviewWidgetList widgets;
26+ for (int i = 0; i < count; i++) {
27+ widgets.push_back(PreviewWidget(std::string(
28+ widget_data[i].p, widget_data[i].n)));
29+ }
30+ *reinterpret_cast<ActivationResponse*>(response) =
31+ ActivationResponse(widgets);
32+ } catch (const std::exception &e) {
33+ *error = strdup(e.what());
34+ }
35+}
36+
37 void activation_response_set_scope_data(_ActivationResponse *response, char *json_data, int json_data_length, char **error) {
38 try {
39 Variant v = Variant::deserialize_json(std::string(json_data, json_data_length));
40
41=== modified file 'activationresponse.go'
42--- activationresponse.go 2015-03-23 11:16:52 +0000
43+++ activationresponse.go 2016-02-03 07:18:51 +0000
44@@ -16,6 +16,8 @@
45 ActivationHideDash
46 ActivationShowPreview
47 ActivationPerformQuery
48+ ActivationUpdateResult
49+ ActivationUpdatePreview
50 )
51
52 // ActivationResponse is used as the result of a Activate() or
53@@ -24,6 +26,8 @@
54 type ActivationResponse struct {
55 Status ActivationStatus
56 Query *CannedQuery
57+ Result *Result
58+ Widgets []PreviewWidget
59 ScopeData interface{}
60 }
61
62@@ -33,8 +37,13 @@
63 // ActivationPerformQuery response: use NewActivationResponseForQuery
64 // instead.
65 func NewActivationResponse(status ActivationStatus) *ActivationResponse {
66- if status == ActivationPerformQuery {
67+ switch status {
68+ case ActivationPerformQuery:
69 panic("Use NewActivationResponseFromQuery for PerformQuery responses")
70+ case ActivationUpdateResult:
71+ panic("Use NewActivationResponseUpdateResult for UpdateResult responses")
72+ case ActivationUpdatePreview:
73+ panic("Use NewActivationResponseUpdatePreview for UpdatePreview responses")
74 }
75 return &ActivationResponse{
76 Status: status,
77@@ -51,10 +60,41 @@
78 }
79 }
80
81+func NewActivationResponseUpdateResult(result *Result) *ActivationResponse {
82+ return &ActivationResponse{
83+ Status: ActivationUpdateResult,
84+ Result: result,
85+ }
86+}
87+
88+func NewActivationResponseUpdatePreview(widgets ...PreviewWidget) *ActivationResponse {
89+ return &ActivationResponse{
90+ Status: ActivationUpdatePreview,
91+ Widgets: widgets,
92+ }
93+}
94+
95 func (r *ActivationResponse) update(responsePtr *C._ActivationResponse) error {
96- if r.Status == ActivationPerformQuery {
97+ switch r.Status {
98+ case ActivationPerformQuery:
99 C.activation_response_init_query(responsePtr, r.Query.q)
100- } else {
101+ case ActivationUpdateResult:
102+ C.activation_response_init_update_result(responsePtr, r.Result.result)
103+ case ActivationUpdatePreview:
104+ widgetData := make([]string, len(r.Widgets))
105+ for i, w := range r.Widgets {
106+ data, err := w.data()
107+ if err != nil {
108+ return err
109+ }
110+ widgetData[i] = string(data)
111+ }
112+ var errorString *C.char
113+ C.activation_response_init_update_preview(responsePtr, unsafe.Pointer(&widgetData[0]), C.int(len(widgetData)), &errorString)
114+ if err := checkError(errorString); err != nil {
115+ return err
116+ }
117+ default:
118 C.activation_response_init_status(responsePtr, C.int(r.Status))
119 }
120 if r.ScopeData != nil {
121
122=== modified file 'activationresponse_test.go'
123--- activationresponse_test.go 2015-03-30 10:11:02 +0000
124+++ activationresponse_test.go 2016-02-03 07:18:51 +0000
125@@ -45,4 +45,17 @@
126 c.Check(response_query.Status, Equals, scopes.ActivationPerformQuery)
127 c.Check(response_query.Query, Equals, query)
128 c.Check(response_query.ScopeData, IsNil)
129+
130+ // test activation response for reply
131+ result := scopes.NewTestingResult()
132+ response = scopes.NewActivationResponseUpdateResult(result)
133+ c.Check(response.Status, Equals, scopes.ActivationUpdateResult)
134+ c.Check(response.Result, Equals, result)
135+
136+ // test activation response for a preview update
137+ widget1 := scopes.NewPreviewWidget("id1", "text")
138+ widget2 := scopes.NewPreviewWidget("id2", "image")
139+ response = scopes.NewActivationResponseUpdatePreview(widget1, widget2)
140+ c.Check(response.Status, Equals, scopes.ActivationUpdatePreview)
141+ c.Check(response.Widgets, DeepEquals, []scopes.PreviewWidget{widget1, widget2})
142 }
143
144=== modified file 'shim.h'
145--- shim.h 2015-06-09 15:03:05 +0000
146+++ shim.h 2016-02-03 07:18:51 +0000
147@@ -135,6 +135,8 @@
148 /* ActivationResponse objects */
149 void activation_response_init_status(_ActivationResponse *response, int status);
150 void activation_response_init_query(_ActivationResponse *response, _CannedQuery *query);
151+void activation_response_init_update_result(_ActivationResponse *response, _Result *result);
152+void activation_response_init_update_preview(_ActivationResponse *response, void *gostring_array, int count, char **error);
153 void activation_response_set_scope_data(_ActivationResponse *response, char *json_data, int json_data_length, char **error);
154
155 /* ColumnLayout objects */

Subscribers

People subscribed via source and target branches

to all changes: