extern void RecvLBS(NETFILE *fp, LargeByteString *lbs) { size_t size; size = RecvLength(fp); LBS_ReserveSize(lbs, size, FALSE); if (size > 0) { Recv(fp, LBS_Body(lbs), size); } }
static LargeByteString * NewLinkData(void) { LargeByteString *linkdata; size_t size; if (ThisEnv->linkrec != NULL) { linkdata = NewLBS(); size = NativeSizeValue(NULL,ThisEnv->linkrec->value); LBS_ReserveSize(linkdata,size,FALSE); NativePackValue(NULL,LBS_Body(linkdata),ThisEnv->linkrec->value); } else { linkdata = NULL; } return linkdata; }
static void GL_RecvLBS( NETFILE *fp, LargeByteString *lbs) { size_t size; ENTER_FUNC; size = GL_RecvLength(fp); LBS_ReserveSize(lbs,size,FALSE); if ( size > 0 ) { Recv(fp,LBS_Body(lbs),size); if ( !CheckNetFile(fp) ) { GL_Error(); } } else { dbgmsg("Recv LBS 0 size."); } LEAVE_FUNC; }
static PacketClass SYSDB_RequestCommon(NETFILE *fp, PacketClass pc, ValueStruct *val) { PacketClass rc; LargeByteString *buf; rc = SESSION_CONTROL_NG; buf = NewLBS(); LBS_ReserveSize(buf, NativeSizeValue(NULL, val), FALSE); NativePackValue(NULL, LBS_Body(buf), val); SendPacketClass(fp, SYSDATA_SYSDB); ON_IO_ERROR(fp, badio); SendPacketClass(fp, pc); ON_IO_ERROR(fp, badio); SendLBS(fp, buf); ON_IO_ERROR(fp, badio); rc = RecvPacketClass(fp); RecvLBS(fp, buf); NativeUnPackValue(NULL, LBS_Body(buf), val); badio: FreeLBS(buf); return rc; }
static SessionData * InitAPISession( char *user, char *ldname, char *wname, char *host) { SessionData *data; LD_Node *ld; RecordStruct *rec; size_t size; uuid_t u; ENTER_FUNC; data = NewSessionData(); data->type = SESSION_TYPE_API; uuid_generate(u); uuid_unparse(u,data->hdr->uuid); strcpy(data->hdr->window,wname); strcpy(data->hdr->user,user); strcpy(data->host,host); data->fInProcess = TRUE; if ((ld = g_hash_table_lookup(APS_Hash, ldname)) != NULL) { data->ld = ld; data->linkdata = NULL; data->cWindow = ld->info->cWindow; data->scrdata = NULL; data->hdr->puttype = SCREEN_NULL; rec = GetWindow(wname); size = NativeSizeValue(NULL,rec->value); LBS_ReserveSize(data->apidata->rec, size,FALSE); NativePackValue(NULL,LBS_Body(data->apidata->rec),rec->value); } else { Warning("[%s] session fail LD [%s] not found.",data->hdr->uuid,ldname); data = NULL; } LEAVE_FUNC; return (data); }
extern void SendStringData( NETFILE *fp, PacketDataType type, char *str) { ENTER_FUNC; GL_SendDataType(fp,type); switch (type) { case GL_TYPE_CHAR: case GL_TYPE_VARCHAR: case GL_TYPE_DBCODE: case GL_TYPE_TEXT: GL_SendString(fp,(char *)str); break; case GL_TYPE_BINARY: case GL_TYPE_BYTE: case GL_TYPE_OBJECT: LBS_ReserveSize(LargeBuff,strlen(str)+1,FALSE); strcpy(LBS_Body(LargeBuff),str); GL_SendLBS(fp,LargeBuff); break; case GL_TYPE_INT: GL_SendInt(fp,atoi(str)); break; case GL_TYPE_FLOAT: GL_SendFloat(fp,atof(str)); break; case GL_TYPE_BOOL: GL_SendBool(fp,(( *str == 'T' ) ? TRUE: FALSE )); break; default: break; } LEAVE_FUNC; }
extern LargeByteString * ValueToLBS( ValueStruct *val, char *codeset) { byte work[SIZE_NUMBUF+1]; byte work2[SIZE_NUMBUF+2]; byte *p , *q; int i; int size; LargeByteString *ret; ENTER_FUNC; if ( val == NULL ) { ret = NULL; } else { dbgprintf("type = %X\n",(int)ValueType(val)); if ( ValueStr(val) == NULL ) { ValueStr(val) = NewLBS(); } LBS_EmitStart(ValueStr(val)); if ( IS_VALUE_NIL(val) ) { LBS_EmitChar(ValueStr(val),CHAR_NIL); } else switch (ValueType(val)) { case GL_TYPE_CHAR: case GL_TYPE_VARCHAR: case GL_TYPE_TEXT: case GL_TYPE_SYMBOL: case GL_TYPE_DBCODE: if ( ValueString(val) != NULL ) { RewindLBS(ValueStr(val)); if ( IS_VALUE_EXPANDABLE(val) ) { LBS_EmitStringCodeset(ValueStr(val),ValueString(val), ValueStringSize(val), ValueStringLength(val),codeset); if ( ( size = ValueStringLength(val) - ValueSize(val) ) > 0 ) { for ( ; size > 0 ; size -- ) { LBS_EmitChar(ValueStr(val),0); } } } else { LBS_EmitStringCodeset(ValueStr(val),ValueString(val), ValueStringSize(val), 0,codeset); } } break; case GL_TYPE_BYTE: case GL_TYPE_BINARY: #ifdef BINARY_IS_BASE64 size = ( ( ValueByteLength(val) + 2 ) / 3 ) * 4; p = (char *)xmalloc(size); size = EncodeBase64(p,size,ValueByte(val),ValueByteLength(val)); LBS_ReserveSize(ValueStr(val),size+1); strcpy(ValueStrBody(val),p); xfree(p); #else p = ValueByte(val); for ( i = 0 ; i < ValueByteLength(val) ; i ++ , p ++ ) { switch (*p) { case '\\': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'\\'); break; case '"': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'"'); break; case '/': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'/'); break; case '\b': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'b'); break; case '\f': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'f'); break; case '\n': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'n'); break; case '\r': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'r'); break; case '\t': LBS_EmitChar(ValueStr(val),'\\'); LBS_EmitChar(ValueStr(val),'t'); break; default: if ( isprint(*p) ) { LBS_EmitChar(ValueStr(val),*p); } else { sprintf(work,"\\u%02X",(int)*p); LBS_EmitString(ValueStr(val),work); } break; } } if ( ( size = ValueStringLength(val) - ValueSize(val) ) > 0 ) { for ( ; size > 0 ; size -- ) { LBS_EmitByte(ValueStr(val),0); } } #endif break; case GL_TYPE_NUMBER: strcpy(work,ValueFixedBody(val)); p = work; q = work2; if ( *p >= 0x70 ) { *q ++ = '-'; *p ^= 0x40; } strcpy(q,p); if ( ValueFixedSlen(val) > 0 ) { p = work2 + strlen(work2); *(p + 1) = 0; q = p - 1; for ( i = 0 ; i < ValueFixedSlen(val) ; i ++ ) { *p -- = *q --; } *p = '.'; } LBS_EmitString(ValueStr(val),work2); break; case GL_TYPE_INT: sprintf(work,"%d",ValueInteger(val)); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_OBJECT: sprintf(work,"%d",(int)ValueObjectId(val)); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_FLOAT: sprintf(work,"%g",ValueFloat(val)); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_BOOL: sprintf(work,"%s",ValueBool(val) ? "TRUE" : "FALSE"); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_TIMESTAMP: sprintf(work,"%04d%02d%02d%02d%02d%02d", ValueDateTimeYear(val), ValueDateTimeMon(val) + 1, ValueDateTimeMDay(val), ValueDateTimeHour(val), ValueDateTimeMin(val), ValueDateTimeSec(val)); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_DATE: sprintf(work,"%04d%02d%02d", ValueDateTimeYear(val), ValueDateTimeMon(val) + 1, ValueDateTimeMDay(val)); LBS_EmitString(ValueStr(val),work); break; case GL_TYPE_TIME: sprintf(work,"%02d%02d%02d", ValueDateTimeHour(val), ValueDateTimeMin(val), ValueDateTimeSec(val)); LBS_EmitString(ValueStr(val),work); break; default: break; } LBS_EmitEnd(ValueStr(val)); ret = ValueStr(val); } LEAVE_FUNC; return (ret); }
extern byte * ValueToBinary( ValueStruct *val) { byte *ret; ENTER_FUNC; if ( val == NULL ) { ret = NULL; } else { dbgprintf("type = %X\n",(int)ValueType(val)); if ( ValueStr(val) == NULL ) { ValueStr(val) = NewLBS(); } LBS_EmitStart(ValueStr(val)); if ( IS_VALUE_NIL(val) ) { LBS_EmitChar(ValueStr(val),CHAR_NIL); } else { switch (ValueType(val)) { case GL_TYPE_CHAR: case GL_TYPE_VARCHAR: case GL_TYPE_DBCODE: case GL_TYPE_TEXT: case GL_TYPE_SYMBOL: if ( ValueString(val) != NULL ) { LBS_ReserveSize(ValueStr(val),strlen(ValueString(val))+1,FALSE); strcpy(ValueStrBody(val),ValueString(val)); } else { LBS_EmitChar(ValueStr(val),CHAR_NIL); } break; case GL_TYPE_BYTE: case GL_TYPE_BINARY: LBS_ReserveSize(ValueStr(val),ValueByteLength(val),FALSE); memcpy(ValueStrBody(val),ValueByte(val),ValueByteLength(val)); break; case GL_TYPE_NUMBER: LBS_ReserveSize(ValueStr(val),sizeof(Fixed),FALSE); memcpy(ValueStrBody(val),&ValueFixed(val),sizeof(Fixed)); break; case GL_TYPE_INT: LBS_ReserveSize(ValueStr(val),sizeof(int),FALSE); memcpy(ValueStrBody(val),&ValueInteger(val),sizeof(int)); break; case GL_TYPE_OBJECT: LBS_ReserveSize(ValueStr(val),sizeof(MonObjectType),FALSE); memcpy(ValueStrBody(val),&ValueObject(val),sizeof(MonObjectType)); break; case GL_TYPE_FLOAT: LBS_ReserveSize(ValueStr(val),sizeof(double),FALSE); memcpy(ValueStrBody(val),&ValueFloat(val),sizeof(double)); break; case GL_TYPE_BOOL: LBS_ReserveSize(ValueStr(val),sizeof(Bool),FALSE); memcpy(ValueStrBody(val),&ValueBool(val),sizeof(Bool)); break; case GL_TYPE_TIMESTAMP: case GL_TYPE_DATE: case GL_TYPE_TIME: LBS_ReserveSize(ValueStr(val),sizeof(int)*9,FALSE); memcpy(ValueStrBody(val),&ValueDateTime(val),sizeof(int)*9); break; default: break; } } ret = ValueStrBody(val); } LEAVE_FUNC; return (ret); }
static void ExecuteDB_Server(MessageHandler *handler) { RecordStruct *rec; ValueStruct *value, *ret; PathStruct *path; DB_Operation *op; size_t size; int rno, pno, ono; DBCOMM_CTRL ctrl; char *rname, *pname, *func; ConvFuncs *conv; InitializeCTRL(&ctrl); conv = handler->serialize; while (TRUE) { dbgmsg("read"); LBS_EmitStart(dbbuff); RecvLargeString(fpDBR, dbbuff); ON_IO_ERROR(fpDBR, badio); ConvSetRecName(handler->conv, recDBCTRL->name); InitializeValue(recDBCTRL->value); conv->UnPackValue(handler->conv, LBS_Body(dbbuff), recDBCTRL->value); rname = ValueStringPointer(GetItemLongName(recDBCTRL->value, "rname")); strncpy(ctrl.rname, rname, SIZE_NAME); value = NULL; ret = NULL; if ((rname != NULL) && ((rno = (int)(long)g_hash_table_lookup(DB_Table, rname)) != 0)) { ctrl.rno = rno - 1; rec = ThisDB[ctrl.rno]; value = rec->value; pname = ValueStringPointer(GetItemLongName(recDBCTRL->value, "pname")); strncpy(ctrl.pname, pname, SIZE_NAME); if ((pno = (int)(long)g_hash_table_lookup(rec->opt.db->paths, pname)) != 0) { ctrl.pno = pno - 1; path = rec->opt.db->path[pno - 1]; value = (path->args != NULL) ? path->args : value; } else { ctrl.pno = 0; path = NULL; } } else { rec = NULL; path = NULL; } func = ValueStringPointer(GetItemLongName(recDBCTRL->value, "func")); if (*func != 0) { if (path == NULL) { Error("path is NULL"); } else if ((ono = (int)(long)g_hash_table_lookup(path->opHash, func)) != 0) { op = path->ops[ono - 1]; value = (op->args != NULL) ? op->args : value; } if (rec != NULL) { ConvSetRecName(handler->conv, rec->name); } else { Error("rec is NULL"); } InitializeValue(value); conv->UnPackValue(handler->conv, LBS_Body(dbbuff), value); strncpy(ctrl.func, func, SIZE_FUNC); ret = ExecDB_Process(&ctrl, rec, value); } else { ctrl.rc = 0; } dbgmsg("write"); SetValueInteger(GetItemLongName(recDBCTRL->value, "rc"), ctrl.rc); ConvSetRecName(handler->conv, recDBCTRL->name); LBS_EmitStart(dbbuff); size = conv->SizeValue(handler->conv, recDBCTRL->value); LBS_ReserveSize(dbbuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(dbbuff), recDBCTRL->value); LBS_EmitEnd(dbbuff); SendLargeString(fpDBW, dbbuff); ON_IO_ERROR(fpDBW, badio); if (ret != NULL) { Send(fpDBW, conv->fsep, strlen(conv->fsep)); ON_IO_ERROR(fpDBW, badio); LBS_EmitStart(dbbuff); if (rec != NULL) { ConvSetRecName(handler->conv, rec->name); } size = conv->SizeValue(handler->conv, ret); LBS_ReserveSize(dbbuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(dbbuff), ret); LBS_EmitEnd(dbbuff); SendLargeString(fpDBW, dbbuff); ON_IO_ERROR(fpDBW, badio); FreeValueStruct(ret); } Send(fpDBW, conv->bsep, strlen(conv->bsep)); ON_IO_ERROR(fpDBW, badio); } badio: return; }
static void PutApplication(MessageHandler *handler, NETFILE *fp, ProcessNode *node) { int i; size_t size; ConvFuncs *conv; DumpNode(node); conv = handler->serialize; ConvSetRecName(handler->conv, node->mcprec->name); size = conv->SizeValue(handler->conv, node->mcprec->value); LBS_EmitStart(iobuff); LBS_ReserveSize(iobuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(iobuff), node->mcprec->value); LBS_EmitEnd(iobuff); SendLargeString(fp, iobuff); ON_IO_ERROR(fp, badio); Send(fp, conv->fsep, strlen(conv->fsep)); ON_IO_ERROR(fp, badio); if (node->linkrec != NULL) { ConvSetRecName(handler->conv, node->linkrec->name); size = conv->SizeValue(handler->conv, node->linkrec->value); LBS_EmitStart(iobuff); LBS_ReserveSize(iobuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(iobuff), node->linkrec->value); LBS_EmitEnd(iobuff); SendLargeString(fp, iobuff); ON_IO_ERROR(fp, badio); Send(fp, conv->fsep, strlen(conv->fsep)); ON_IO_ERROR(fp, badio); } if (node->sparec != NULL) { ConvSetRecName(handler->conv, node->sparec->name); size = conv->SizeValue(handler->conv, node->sparec->value); LBS_EmitStart(iobuff); LBS_ReserveSize(iobuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(iobuff), node->sparec->value); LBS_EmitEnd(iobuff); SendLargeString(fp, iobuff); ON_IO_ERROR(fp, badio); } for (i = 0; i < node->cWindow; i++) { LBS_EmitStart(iobuff); if (node->scrrec[i] != NULL) { ConvSetRecName(handler->conv, node->scrrec[i]->name); size = conv->SizeValue(handler->conv, node->scrrec[i]->value); if (size > 0) { Send(fp, conv->fsep, strlen(conv->fsep)); ON_IO_ERROR(fp, badio); } LBS_ReserveSize(iobuff, size, FALSE); conv->PackValue(handler->conv, LBS_Body(iobuff), node->scrrec[i]->value); } LBS_EmitEnd(iobuff); SendLargeString(fp, iobuff); ON_IO_ERROR(fp, badio); } Send(fp, conv->bsep, strlen(conv->bsep)); ON_IO_ERROR(fp, badio); badio: return; }