GvName GvFieldData::getEventInName(int index) const { const GvName &n = getFieldName(index); GvFieldEntry *fieldEntry = getFieldEntry(index); if (fieldEntry->type /* getType()*/ <= GV_EXPOSED_FIELD) { GvString s("set_"); s+=n.getString(); return(GvName(s)); } else return n; }
GvName GvFieldData::getEventOutName(int index) const { const GvName &n = getFieldName(index); GvFieldEntry *fieldEntry = getFieldEntry(index); if (fieldEntry->type /*getType()*/ <= GV_EXPOSED_FIELD) { GvString s(n.getString()); s+="_changed"; return(GvName(s)); } else return(n); }
const char * GvFieldData::getFieldType(const GvNode *object, int index) const { const char *t = NULL; GvField *f = object->getField(index); if (f == NULL) { GvFieldEntry *fieldEntry = getFieldEntry(index); return(fieldEntry->getType()); } else t = f->ClassName(); if (strncmp(t,"Gv",2) == 0) return (t+2); return(t); }
void getInstanceFieldEntry(u2 index, u2* address, u1* size) { getFieldEntry(index, address, size); }
void getStaticFieldEntry(u2 index, u2* address, u1* size) { getFieldEntry(index, address, size); }
GvBool GvFieldData::read(GvInput *in, GvNode *object, const GvName &fieldName, GvBool &foundName) const { int i; // to do: event translation in PROTOS for (i = 0; i < fields.getLength(); i++) { GvName fni = getFieldName(i); if (fieldName == fni) { foundName = TRUE; GvField *field = getField(object, i); GvFieldEntry *fieldEntry = getFieldEntry(i); GvBool isEvent = FALSE; switch (fieldEntry->type) { case GV_FIELD_EVENT_OUT: case GV_FIELD_EVENT_IN: case GV_NODE_EVENT_IN: isEvent=TRUE; break; } if (isEvent || field == NULL) { if (in->currentProto != NULL) { return in->currentProto->readEventTranslation(in,object,fieldName,i); } else { if (field == NULL) { // eventIn Out can not be readed but ... GvReadError::post(in,GV_RE_UNKNOWN_FIELD, "%s::Can not read event field %s",object->GetType(), fieldName.getString()); return FALSE; // hg 16.11.99 } if (fieldEntry->type == GV_NODE_EVENT_IN) return FALSE; // can continue, simply read in field } } if (!field) return(FALSE); if (!field->read(in, fieldName)) return FALSE; break; } } if (i == fields.getLength()) foundName = FALSE; else foundName = TRUE; // VRML 2.0 draft #2 fix, ignore s at end if (!foundName) { // Interpolater values ==> keyValues if (fieldName == "values") { // return read(in,object,"keyValue",foundName); } if (fieldName == "whichChild") { // switch return read(in,object,"whichChoice",foundName); } if (strsuffix(fieldName.getString(),'s')) { const char *s = fieldName.getString(); int slen = strlen(s); GvString ss; char *p=ss.getBuffer(slen+1); strcpy(p,s); p[slen-1]= 0; ss.releaseBuffer(); GvName newFieldName(ss); return read(in,object,newFieldName,foundName); } if (fieldName == "rgb") { // Color return read(in,object,"color",foundName); } // return (FALSE); gives problem in VRML 1.0 } if (!foundName) { GvBool isEvent = FALSE; int i = getEventInIndex(object,fieldName); if (i<0) i = getEventOutIndex(object,fieldName); if (i>=0) { foundName = TRUE; if (in->currentProto != NULL) { return in->currentProto->readEventTranslation(in,object,fieldName,i); } else { GvReadError::post(in,GV_RE_UNKNOWN_FIELD, "%s::Can not read event field %s outside PROTO ",object->GetType(), fieldName.getString()); } } } return TRUE; }