2323
2424#include < utility>
2525#include < cstring>
26+ #include < malloc.h>
2627
2728g_component::~g_component ()
2829{
@@ -201,21 +202,24 @@ bool g_component::setStringProperty(int property, std::string value)
201202
202203 g_message_transaction tx = g_get_message_tx_id ();
203204
204- auto request = new g_ui_component_set_string_property_request ();
205+ auto requestSize = sizeof (g_ui_component_set_string_property_request) + value.length () + 1 ;
206+ auto request = static_cast <g_ui_component_set_string_property_request*>(
207+ operator new (sizeof (g_ui_component_set_string_property_request) + value.length () + 1 )
208+ );
205209 request->header .id = G_UI_PROTOCOL_SET_STRING_PROPERTY;
206210 request->id = this ->id ;
207211 request->property = property;
208- strncpy (request->value , value.c_str (), G_UI_STRING_PROPERTY_MAXIMUM - 1 );
212+ strcpy (request->value , value.c_str ());
209213
210- g_send_message_t (g_ui_delegate_tid, request, sizeof (g_ui_component_set_string_property_request) , tx);
214+ g_send_message_t (g_ui_delegate_tid, request, requestSize , tx);
211215 g_yield_t (g_ui_delegate_tid);
212216
213- size_t bufferSize = sizeof (g_message_header) + sizeof (g_ui_simple_response);
214- uint8_t buffer[bufferSize ];
217+ size_t responseBufferSize = sizeof (g_message_header) + sizeof (g_ui_simple_response);
218+ uint8_t responseBuffer[responseBufferSize ];
215219 bool success = false ;
216- if (g_receive_message_t (buffer, bufferSize , tx) == G_MESSAGE_RECEIVE_STATUS_SUCCESSFUL)
220+ if (g_receive_message_t (responseBuffer, responseBufferSize , tx) == G_MESSAGE_RECEIVE_STATUS_SUCCESSFUL)
217221 {
218- auto response = (g_ui_simple_response*) G_MESSAGE_CONTENT (buffer );
222+ auto response = (g_ui_simple_response*) G_MESSAGE_CONTENT (responseBuffer );
219223 success = (response->status == G_UI_PROTOCOL_SUCCESS);
220224 }
221225
@@ -237,20 +241,26 @@ bool g_component::getStringProperty(int property, std::string& out)
237241 g_send_message_t (g_ui_delegate_tid, &request, sizeof (g_ui_component_get_string_property_request), tx);
238242 g_yield_t (g_ui_delegate_tid);
239243
240- size_t bufferSize = sizeof (g_message_header) + sizeof (g_ui_component_get_string_property_response);
241- auto buffer = new uint8_t [bufferSize];
242244 bool success = false ;
243- if ( g_receive_message_t (buffer, bufferSize, tx) == G_MESSAGE_RECEIVE_STATUS_SUCCESSFUL )
245+ for ( int size = 128 ; size <= 1024 ; size *= 2 )
244246 {
245- auto response = (g_ui_component_get_string_property_response*) G_MESSAGE_CONTENT (buffer);
246- if (response->status == G_UI_PROTOCOL_SUCCESS)
247+ size_t bufferSize = sizeof (g_message_header) + sizeof (g_ui_component_get_string_property_response) + size;
248+ auto buffer = new uint8_t [bufferSize];
249+ auto receiveStatus = g_receive_message_t (buffer, bufferSize, tx);
250+ if (receiveStatus == G_MESSAGE_RECEIVE_STATUS_SUCCESSFUL)
247251 {
248- success = true ;
249- out = std::string (response->value );
252+ auto response = (g_ui_component_get_string_property_response*) G_MESSAGE_CONTENT (buffer);
253+ if (response->status == G_UI_PROTOCOL_SUCCESS)
254+ {
255+ success = true ;
256+ out = std::string (response->value );
257+ }
250258 }
251- }
259+ delete buffer;
252260
253- delete buffer;
261+ if (success || receiveStatus != G_MESSAGE_RECEIVE_STATUS_EXCEEDS_BUFFER_SIZE)
262+ break ;
263+ }
254264 return success;
255265}
256266
0 commit comments