Просмотр исходного кода

ncd: NCDRequestClient: port NCDValue-->NCDVal

ambrop7 13 лет назад
Родитель
Сommit
c4f99cdfe9
4 измененных файлов с 41 добавлено и 55 удалено
  1. 18 16
      ncd-request/ncd-request.c
  2. 14 9
      ncd/NCDRequestClient.c
  3. 2 2
      ncd/NCDRequestClient.h
  4. 7 28
      ncd/modules/sys_request_client.c

+ 18 - 16
ncd-request/ncd-request.c

@@ -47,12 +47,13 @@
 static void client_handler_error (void *user);
 static void client_handler_error (void *user);
 static void client_handler_connected (void *user);
 static void client_handler_connected (void *user);
 static void request_handler_sent (void *user);
 static void request_handler_sent (void *user);
-static void request_handler_reply (void *user, NCDValue reply_data);
+static void request_handler_reply (void *user, NCDValMem reply_mem, NCDValRef reply_value);
 static void request_handler_finished (void *user, int is_error);
 static void request_handler_finished (void *user, int is_error);
 static int write_all (int fd, const uint8_t *data, size_t len);
 static int write_all (int fd, const uint8_t *data, size_t len);
 static int make_connect_addr (const char *str, struct NCDRequestClient_addr *out_addr);
 static int make_connect_addr (const char *str, struct NCDRequestClient_addr *out_addr);
 
 
-NCDValue request_payload;
+NCDValMem request_mem;
+NCDValRef request_value;
 BReactor reactor;
 BReactor reactor;
 NCDRequestClient client;
 NCDRequestClient client;
 NCDRequestClientRequest request;
 NCDRequestClientRequest request;
@@ -74,29 +75,31 @@ int main (int argc, char *argv[])
     
     
     BTime_Init();
     BTime_Init();
     
     
-    if (!NCDValueParser_Parse(request_payload_string, strlen(request_payload_string), &request_payload)) {
+    NCDValMem_Init(&request_mem);
+    
+    if (!NCDValParser_Parse(request_payload_string, strlen(request_payload_string), &request_mem, &request_value)) {
         BLog(BLOG_ERROR, "BReactor_Init failed");
         BLog(BLOG_ERROR, "BReactor_Init failed");
         goto fail1;
         goto fail1;
     }
     }
     
     
     if (!BNetwork_GlobalInit()) {
     if (!BNetwork_GlobalInit()) {
         BLog(BLOG_ERROR, "BNetwork_Init failed");
         BLog(BLOG_ERROR, "BNetwork_Init failed");
-        goto fail2;
+        goto fail1;
     }
     }
     
     
     if (!BReactor_Init(&reactor)) {
     if (!BReactor_Init(&reactor)) {
         BLog(BLOG_ERROR, "BReactor_Init failed");
         BLog(BLOG_ERROR, "BReactor_Init failed");
-        goto fail2;
+        goto fail1;
     }
     }
     
     
     struct NCDRequestClient_addr addr;
     struct NCDRequestClient_addr addr;
     if (!make_connect_addr(connect_address, &addr)) {
     if (!make_connect_addr(connect_address, &addr)) {
-        goto fail3;
+        goto fail2;
     }
     }
     
     
     if (!NCDRequestClient_Init(&client, addr, &reactor, NULL, client_handler_error, client_handler_connected)) {
     if (!NCDRequestClient_Init(&client, addr, &reactor, NULL, client_handler_error, client_handler_connected)) {
         BLog(BLOG_ERROR, "NCDRequestClient_Init failed");
         BLog(BLOG_ERROR, "NCDRequestClient_Init failed");
-        goto fail3;
+        goto fail2;
     }
     }
     
     
     have_request = 0;
     have_request = 0;
@@ -107,11 +110,10 @@ int main (int argc, char *argv[])
         NCDRequestClientRequest_Free(&request);
         NCDRequestClientRequest_Free(&request);
     }
     }
     NCDRequestClient_Free(&client);
     NCDRequestClient_Free(&client);
-fail3:
-    BReactor_Free(&reactor);
 fail2:
 fail2:
-    NCDValue_Free(&request_payload);
+    BReactor_Free(&reactor);
 fail1:
 fail1:
+    NCDValMem_Free(&request_mem);
     BLog_Free();
     BLog_Free();
 fail0:
 fail0:
     DebugObjectGlobal_Finish();
     DebugObjectGlobal_Finish();
@@ -153,7 +155,7 @@ static void client_handler_connected (void *user)
 {
 {
     ASSERT(!have_request)
     ASSERT(!have_request)
     
     
-    if (!NCDRequestClientRequest_Init(&request, &client, &request_payload, NULL, request_handler_sent, request_handler_reply, request_handler_finished)) {
+    if (!NCDRequestClientRequest_Init(&request, &client, request_value, NULL, request_handler_sent, request_handler_reply, request_handler_finished)) {
         BLog(BLOG_ERROR, "NCDRequestClientRequest_Init failed");
         BLog(BLOG_ERROR, "NCDRequestClientRequest_Init failed");
         BReactor_Quit(&reactor, 1);
         BReactor_Quit(&reactor, 1);
         return;
         return;
@@ -167,13 +169,13 @@ static void request_handler_sent (void *user)
     ASSERT(have_request)
     ASSERT(have_request)
 }
 }
 
 
-static void request_handler_reply (void *user, NCDValue reply_data)
+static void request_handler_reply (void *user, NCDValMem reply_mem, NCDValRef reply_value)
 {
 {
     ASSERT(have_request)
     ASSERT(have_request)
     
     
-    char *str = NCDValueGenerator_Generate(&reply_data);
+    char *str = NCDValGenerator_Generate(reply_value);
     if (!str) {
     if (!str) {
-        BLog(BLOG_ERROR, "NCDValueGenerator_Generate failed");
+        BLog(BLOG_ERROR, "NCDValGenerator_Generate failed");
         goto fail0;
         goto fail0;
     }
     }
     
     
@@ -185,13 +187,13 @@ static void request_handler_reply (void *user, NCDValue reply_data)
     }
     }
     
     
     free(str);
     free(str);
-    NCDValue_Free(&reply_data);
+    NCDValMem_Free(&reply_mem);
     return;
     return;
     
     
 fail1:
 fail1:
     free(str);
     free(str);
 fail0:
 fail0:
-    NCDValue_Free(&reply_data);
+    NCDValMem_Free(&reply_mem);
     BReactor_Quit(&reactor, 1);
     BReactor_Quit(&reactor, 1);
 }
 }
 
 

+ 14 - 9
ncd/NCDRequestClient.c

@@ -70,7 +70,7 @@ static void decoder_handler_error (NCDRequestClient *o);
 static void recv_if_handler_send (NCDRequestClient *o, uint8_t *data, int data_len);
 static void recv_if_handler_send (NCDRequestClient *o, uint8_t *data, int data_len);
 static struct NCDRequestClient_req * find_req (NCDRequestClient *o, uint32_t request_id);
 static struct NCDRequestClient_req * find_req (NCDRequestClient *o, uint32_t request_id);
 static int get_free_request_id (NCDRequestClient *o, uint32_t *out);
 static int get_free_request_id (NCDRequestClient *o, uint32_t *out);
-static int build_requestproto_packet (uint32_t request_id, uint32_t type, NCDValue *payload_value, uint8_t **out_data, int *out_len);
+static int build_requestproto_packet (uint32_t request_id, uint32_t type, NCDValRef payload_value, uint8_t **out_data, int *out_len);
 static void build_nodata_packet (uint32_t request_id, uint32_t type, uint8_t *data, int *out_len);
 static void build_nodata_packet (uint32_t request_id, uint32_t type, uint8_t *data, int *out_len);
 static int req_is_aborted (struct NCDRequestClient_req *req);
 static int req_is_aborted (struct NCDRequestClient_req *req);
 static void req_abort (struct NCDRequestClient_req *req);
 static void req_abort (struct NCDRequestClient_req *req);
@@ -213,15 +213,20 @@ static void recv_if_handler_send (NCDRequestClient *o, uint8_t *data, int data_l
         case REQUESTPROTO_TYPE_SERVER_REPLY: {
         case REQUESTPROTO_TYPE_SERVER_REPLY: {
             switch (o->state) {
             switch (o->state) {
                 case RSTATE_READY: {
                 case RSTATE_READY: {
+                    // init memory
+                    NCDValMem mem;
+                    NCDValMem_Init(&mem);
+                    
                     // parse payload
                     // parse payload
-                    NCDValue payload_value;
-                    if (!NCDValueParser_Parse((char *)payload, payload_len, &payload_value)) {
+                    NCDValRef payload_value;
+                    if (!NCDValParser_Parse((char *)payload, payload_len, &mem, &payload_value)) {
                         BLog(BLOG_ERROR, "failed to parse reply payload");
                         BLog(BLOG_ERROR, "failed to parse reply payload");
+                        NCDValMem_Free(&mem);
                         goto fail;
                         goto fail;
                     }
                     }
                     
                     
                     // call reply handler
                     // call reply handler
-                    req->creq->handler_reply(req->creq->user, payload_value);
+                    req->creq->handler_reply(req->creq->user, mem, payload_value);
                     return;
                     return;
                 } break;
                 } break;
                 
                 
@@ -308,7 +313,7 @@ static int get_free_request_id (NCDRequestClient *o, uint32_t *out)
     return 0;
     return 0;
 }
 }
 
 
-static int build_requestproto_packet (uint32_t request_id, uint32_t type, NCDValue *payload_value, uint8_t **out_data, int *out_len)
+static int build_requestproto_packet (uint32_t request_id, uint32_t type, NCDValRef payload_value, uint8_t **out_data, int *out_len)
 {
 {
     struct header {
     struct header {
         struct packetproto_header pp;
         struct packetproto_header pp;
@@ -326,8 +331,8 @@ static int build_requestproto_packet (uint32_t request_id, uint32_t type, NCDVal
         goto fail1;
         goto fail1;
     }
     }
     
     
-    if (payload_value && !NCDValueGenerator_AppendGenerate(payload_value, &str)) {
-        BLog(BLOG_ERROR, "NCDValueGenerator_AppendGenerate failed");
+    if (!NCDVal_IsInvalid(payload_value) && !NCDValGenerator_AppendGenerate(payload_value, &str)) {
+        BLog(BLOG_ERROR, "NCDValGenerator_AppendGenerate failed");
         goto fail1;
         goto fail1;
     }
     }
     
     
@@ -549,14 +554,14 @@ void NCDRequestClient_Free (NCDRequestClient *o)
     BConnector_Free(&o->connector);
     BConnector_Free(&o->connector);
 }
 }
 
 
-int NCDRequestClientRequest_Init (NCDRequestClientRequest *o, NCDRequestClient *client, NCDValue *payload_value, void *user,
+int NCDRequestClientRequest_Init (NCDRequestClientRequest *o, NCDRequestClient *client, NCDValRef payload_value, void *user,
                                   NCDRequestClientRequest_handler_sent handler_sent,
                                   NCDRequestClientRequest_handler_sent handler_sent,
                                   NCDRequestClientRequest_handler_reply handler_reply,
                                   NCDRequestClientRequest_handler_reply handler_reply,
                                   NCDRequestClientRequest_handler_finished handler_finished)
                                   NCDRequestClientRequest_handler_finished handler_finished)
 {
 {
     ASSERT(client->state == CSTATE_CONNECTED)
     ASSERT(client->state == CSTATE_CONNECTED)
     DebugError_AssertNoError(&client->d_err);
     DebugError_AssertNoError(&client->d_err);
-    ASSERT(payload_value)
+    ASSERT(!NCDVal_IsInvalid(payload_value))
     ASSERT(handler_sent)
     ASSERT(handler_sent)
     ASSERT(handler_reply)
     ASSERT(handler_reply)
     ASSERT(handler_finished)
     ASSERT(handler_finished)

+ 2 - 2
ncd/NCDRequestClient.h

@@ -49,7 +49,7 @@ struct NCDRequestClient_req;
 typedef void (*NCDRequestClient_handler_error) (void *user);
 typedef void (*NCDRequestClient_handler_error) (void *user);
 typedef void (*NCDRequestClient_handler_connected) (void *user);
 typedef void (*NCDRequestClient_handler_connected) (void *user);
 typedef void (*NCDRequestClientRequest_handler_sent) (void *user);
 typedef void (*NCDRequestClientRequest_handler_sent) (void *user);
-typedef void (*NCDRequestClientRequest_handler_reply) (void *user, NCDValue reply_data);
+typedef void (*NCDRequestClientRequest_handler_reply) (void *user, NCDValMem reply_mem, NCDValRef reply_value);
 typedef void (*NCDRequestClientRequest_handler_finished) (void *user, int is_error);
 typedef void (*NCDRequestClientRequest_handler_finished) (void *user, int is_error);
 
 
 typedef struct {
 typedef struct {
@@ -117,7 +117,7 @@ int NCDRequestClient_Init (NCDRequestClient *o, struct NCDRequestClient_addr add
                            NCDRequestClient_handler_connected handler_connected) WARN_UNUSED;
                            NCDRequestClient_handler_connected handler_connected) WARN_UNUSED;
 void NCDRequestClient_Free (NCDRequestClient *o);
 void NCDRequestClient_Free (NCDRequestClient *o);
 
 
-int NCDRequestClientRequest_Init (NCDRequestClientRequest *o, NCDRequestClient *client, NCDValue *payload_value, void *user,
+int NCDRequestClientRequest_Init (NCDRequestClientRequest *o, NCDRequestClient *client, NCDValRef payload_value, void *user,
                                   NCDRequestClientRequest_handler_sent handler_sent,
                                   NCDRequestClientRequest_handler_sent handler_sent,
                                   NCDRequestClientRequest_handler_reply handler_reply,
                                   NCDRequestClientRequest_handler_reply handler_reply,
                                   NCDRequestClientRequest_handler_finished handler_finished) WARN_UNUSED;
                                   NCDRequestClientRequest_handler_finished handler_finished) WARN_UNUSED;

+ 7 - 28
ncd/modules/sys_request_client.c

@@ -148,7 +148,7 @@ struct reply {
 static void client_handler_error (struct instance *o);
 static void client_handler_error (struct instance *o);
 static void client_handler_connected (struct instance *o);
 static void client_handler_connected (struct instance *o);
 static void request_handler_sent (struct request_instance *o);
 static void request_handler_sent (struct request_instance *o);
-static void request_handler_reply (struct request_instance *o, NCDValue reply_data);
+static void request_handler_reply (struct request_instance *o, NCDValMem reply_mem, NCDValRef reply_value);
 static void request_handler_finished (struct request_instance *o, int is_error);
 static void request_handler_finished (struct request_instance *o, int is_error);
 static void request_process_handler_event (struct request_instance *o, int event);
 static void request_process_handler_event (struct request_instance *o, int event);
 static int request_process_func_getspecialobj (struct request_instance *o, const char *name, NCDObject *out_object);
 static int request_process_func_getspecialobj (struct request_instance *o, const char *name, NCDObject *out_object);
@@ -194,21 +194,10 @@ static void request_handler_sent (struct request_instance *o)
     o->rstate = RRSTATE_READY;
     o->rstate = RRSTATE_READY;
 }
 }
 
 
-static void request_handler_reply (struct request_instance *o, NCDValue reply_data)
+static void request_handler_reply (struct request_instance *o, NCDValMem reply_mem, NCDValRef reply_value)
 {
 {
     ASSERT(o->rstate == RRSTATE_READY)
     ASSERT(o->rstate == RRSTATE_READY)
     
     
-    NCDValMem mem;
-    NCDValMem_Init(&mem);
-    
-    NCDValRef val;
-    int res = NCDValCompat_ValueToVal(&reply_data, &mem, &val);
-    NCDValue_Free(&reply_data);
-    if (!res) {
-        ModuleLog(o->i, BLOG_ERROR, "NCDValCompat_ValueToVal failed");
-        goto fail1;
-    }
-    
     // queue reply if process is running
     // queue reply if process is running
     if (o->pstate != RPSTATE_NONE) {
     if (o->pstate != RPSTATE_NONE) {
         struct reply *r = malloc(sizeof(*r));
         struct reply *r = malloc(sizeof(*r));
@@ -216,21 +205,21 @@ static void request_handler_reply (struct request_instance *o, NCDValue reply_da
             ModuleLog(o->i, BLOG_ERROR, "malloc failed");
             ModuleLog(o->i, BLOG_ERROR, "malloc failed");
             goto fail1;
             goto fail1;
         }
         }
-        r->mem = mem;
-        r->val = NCDVal_Moved(&r->mem, val);
+        r->mem = reply_mem;
+        r->val = NCDVal_Moved(&r->mem, reply_value);
         LinkedList1_Append(&o->replies_list, &r->replies_list_node);
         LinkedList1_Append(&o->replies_list, &r->replies_list_node);
         return;
         return;
     }
     }
     
     
     // start reply process
     // start reply process
-    if (!request_init_reply_process(o, mem, NCDVal_ToSafe(val))) {
+    if (!request_init_reply_process(o, reply_mem, NCDVal_ToSafe(reply_value))) {
         goto fail1;
         goto fail1;
     }
     }
     
     
     return;
     return;
     
     
 fail1:
 fail1:
-    NCDValMem_Free(&mem);
+    NCDValMem_Free(&reply_mem);
     request_die(o, 1);
     request_die(o, 1);
 }
 }
 
 
@@ -638,25 +627,15 @@ static void request_func_new (void *vo, NCDModuleInst *i)
         goto fail0;
         goto fail0;
     }
     }
     
     
-    // convert argument to old format
-    NCDValue request_data_compat;
-    if (!NCDValCompat_ValToValue(request_data_arg, &request_data_compat)) {
-        ModuleLog(o->i, BLOG_ERROR, "NCDValCompat_ValToValue failed");
-        goto fail0;
-    }
-    
     // init request
     // init request
-    if (!NCDRequestClientRequest_Init(&o->request, &client->client, &request_data_compat, o,
+    if (!NCDRequestClientRequest_Init(&o->request, &client->client, request_data_arg, o,
         (NCDRequestClientRequest_handler_sent)request_handler_sent,
         (NCDRequestClientRequest_handler_sent)request_handler_sent,
         (NCDRequestClientRequest_handler_reply)request_handler_reply,
         (NCDRequestClientRequest_handler_reply)request_handler_reply,
         (NCDRequestClientRequest_handler_finished)request_handler_finished)) {
         (NCDRequestClientRequest_handler_finished)request_handler_finished)) {
         ModuleLog(o->i, BLOG_ERROR, "NCDRequestClientRequest_Init failed");
         ModuleLog(o->i, BLOG_ERROR, "NCDRequestClientRequest_Init failed");
-        NCDValue_Free(&request_data_compat);
         goto fail0;
         goto fail0;
     }
     }
     
     
-    NCDValue_Free(&request_data_compat);
-    
     // add to requests list
     // add to requests list
     LinkedList0_Prepend(&client->requests_list, &o->requests_list_node);
     LinkedList0_Prepend(&client->requests_list, &o->requests_list_node);