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);
}
Exemple #4
0
void getInstanceFieldEntry(u2 index, u2* address, u1* size) {
	getFieldEntry(index, address, size);
}
Exemple #5
0
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;
}