/** * Initialize the application * @param argc argument count * @param argv argument values * @return SUCCEED/FAIL */ int init(int argc, char** argv) { int ret = SUCCEED; TP_LOG(log_info, "Initialising..."); if (SUCCEED!=tpinit(NULL)) { TP_LOG(log_error, "Failed to Initialise: %s", tpstrerror(tperrno)); ret = FAIL; goto out; } /* Advertise our service */ if (SUCCEED!=tpadvertise(msg_service(), USERREGSV)) { TP_LOG(log_error, "Failed to initialise USERREGSV_UBF!"); ret=FAIL; goto out; } out: return ret; }
/** * Service entry * @return SUCCEED/FAIL */ void USERREGSV (TPSVCINFO *p_svc) { int ret = SUCCEED; int rsp = 0; Message_t msg; long len; char * buf = p_svc->data; memset(&msg, 0, sizeof(msg)); /* allocate some stuff for more data to put in */ len = tptypes(p_svc->data, NULL, NULL) + 1024; if (NULL==(buf = tprealloc(buf, len))) { TP_LOG(log_error, "Failed reallocate buffer to size %d: %s", len, tpstrerror(tperrno)); ret=FAIL; goto out; } if (SUCCEED != parse_msg(&msg, buf, len)) { TP_LOG(log_error, "Failed to parse msg"); ret=FAIL; goto out; } msg.rsp.rspstatus = 100; strcpy(msg.rsp.rsprspmsg, "User successfully registered"); if(SUCCEED != msg_build(&msg, &buf, &len)) { TP_LOG(log_error, "Failed to build msg"); ret=FAIL; goto out; } out: tpreturn( ret==SUCCEED?TPSUCCESS:TPFAIL, 0L, buf, 0L, 0L); }
void CBattleFieldLayer::update(float dt) { TP_LOG_BEGIN(0); TP_LOG("begin", 0); GAME_TIME->update(dt); BF_MANAGER->update(dt); EFFECT_MANAGER->update(dt); TP_LOG("1", 0); Array* children = getChildren(); Object* obj; CCARRAY_FOREACH(children, obj) { obj->update(dt); }
/** * Build outgoing message * @param[in] msg full message to send * @param[out] outbuf output buffer/XATMI allocated * @param[out] olen output buffer len * @return SUCCEED/FAIL */ int msg_build(Message_t *msg, char **outbuf, long *olen) { int ret = SUCCEED; msgbuilder_t *p = M_msgflds; short *p_short; long *p_long; void *fld_ptr; char *p_string_el; char tmpbuf[64]; char tmpbuf2[64]; xmlDocPtr newDoc; xmlNodePtr rootNode; short *p_items; int i; xmlChar *xmlDocInMemory = NULL; int size = 0; /* Alloc STRING into obuf */ if (NULL==*outbuf) { *outbuf = tpalloc("STRING", NULL, MAX_BUFSZ); } if (NULL==*outbuf) { TP_LOG(log_error, "Failed to alloc %d bytes: %s", MAX_BUFSZ, tpstrerror(tperrno)); ret=FAIL; goto out; } /* start libxml2 XML doc */ newDoc = xmlNewDoc( BAD_CAST XML_VERSION ); rootNode = xmlNewNode(NULL, BAD_CAST "user"); xmlDocSetRootElement(newDoc, rootNode); while (0!=p->tag[0]) { fld_ptr = (char *)msg + p->msgoffs + p->elmoffs; switch (p->elmtyp) { case MSG_SHORT: p_short = (short *)fld_ptr; snprintf(tmpbuf, sizeof(tmpbuf), "%hd", *p_short); xmlNewTextChild( rootNode, NULL, BAD_CAST p->tag, BAD_CAST tmpbuf ); break; case MSG_LONG: p_long = (long *)fld_ptr; snprintf(tmpbuf, sizeof(tmpbuf), "%ld", *p_long); xmlNewTextChild( rootNode, NULL, BAD_CAST p->tag, BAD_CAST tmpbuf ); break; case MSG_STRING: xmlNewTextChild( rootNode, NULL, BAD_CAST p->tag, BAD_CAST ((char *)fld_ptr) ); break; case MSG_ARRAY_SHORT: p_items = (short *)((char *)msg + p->msgoffs + p->itmoffs); for (i=0; i<*p_items; i++) { p_short = (short *)( (char *)fld_ptr + i*sizeof(short)); snprintf(tmpbuf, sizeof(tmpbuf), "%hd", *p_short); snprintf(tmpbuf2, sizeof(tmpbuf), "%s_%d", p->tag, i); xmlNewTextChild( rootNode, NULL, BAD_CAST tmpbuf2, BAD_CAST tmpbuf ); } break; case MSG_ARRAY_STRING: p_items = (short *)((char *)msg + p->msgoffs + p->itmoffs); for (i=0; i<*p_items; i++) { /* calculate string array element location */ p_string_el = (char *)fld_ptr + i*MAX_STR; snprintf(tmpbuf2, sizeof(tmpbuf), "%s_%d", p->tag, i); xmlNewTextChild( rootNode, NULL, BAD_CAST tmpbuf2, BAD_CAST p_string_el ); } break; default: TP_LOG(log_error, "Unknown element type %d tag: [%s]!", p->elmtyp, p->tag); ret=FAIL; goto out; break; } p++; } /* build xmldoc, copy to outbuf, specify size */ xmlDocDumpMemory( newDoc, &xmlDocInMemory, &size ); strncpy(*outbuf, xmlDocInMemory, size); (*outbuf)[size] = 0; *olen = size+1; xmlFree(xmlDocInMemory); TP_LOG(log_debug, "got XML [%s]", *outbuf); out: if (NULL != newDoc) { xmlFreeDoc( newDoc ); } return ret; }
/** * Parse incoming message, send all data to msg * @param msg domain model msg * @param ibuf input buffer * @param ilen input buffer len * @return SUCCEED/FAIL */ int parse_msg(Message_t *msg, char *ibuf, long ilen) { int ret = SUCCEED; msgbuilder_t *descr; char *buf; short *p_short; long *p_long; char *cp; void *fld_ptr; char *p_string_el; xmlDocPtr doc; xmlNodePtr rootNode; xmlNode *currentNode = NULL; short item; /* start libxml2 XML doc */ doc = xmlReadMemory( ibuf, strlen(ibuf), NULL, NULL, 0 ); if ( NULL == doc ) { TP_LOG(log_error, "Failed to read XML document!"); return FAIL; } rootNode = xmlDocGetRootElement( doc ); currentNode = rootNode->children; /* loop over all tags */ for (; currentNode; currentNode = currentNode->next ) { /* find tag descriptor */ if (NULL==(descr = get_tag((char *)currentNode->name))) { TP_LOG(log_error, "Failed to get tag descr for [%s]", currentNode->name); ret = FAIL; goto out; } /* get the content of the tag */ if (NULL==(buf = (char *)xmlNodeGetContent(currentNode))) { TP_LOG(log_error, "NULL tag: [%s]", currentNode->name); ret = FAIL; goto out; } TP_LOG(log_debug, "got tag [%s] value [%s]", currentNode->name, buf?buf:"(null)"); /* load the field into struct accordingly */ fld_ptr = (char *)msg + descr->msgoffs + descr->elmoffs; switch (descr->elmtyp) { case MSG_SHORT: p_short = (short *)fld_ptr; *p_short = atoi(buf); break; case MSG_LONG: p_long = (long *)fld_ptr; *p_long = atol(buf); break; case MSG_STRING: strcpy((char *)fld_ptr, buf); break; case MSG_ARRAY_SHORT: /* get item number from tag */ cp = strchr(currentNode->name, '_'); cp++; item = atoi(cp); p_short = (short *)( (char *)fld_ptr + item*sizeof(short)); *p_short = atoi(buf); break; case MSG_ARRAY_STRING: /* get item number from tag */ cp = strchr(currentNode->name, '_'); cp++; item = atoi(cp); p_string_el = ( (char *)fld_ptr + item*MAX_STR); strcpy(p_string_el, buf); break; default: TP_LOG(log_error, "Unknown element type %d!", descr->elmtyp); ret=FAIL; goto out; break; } xmlFree(buf); } out: if(doc) { xmlFreeDoc(doc); } return ret; }
/** * Terminate the application */ void uninit(void) { TP_LOG(log_info, "Uninitialising..."); }