IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 15116


Ignore:
Timestamp:
Sep 29, 2007, 12:18:39 PM (19 years ago)
Author:
eugene
Message:

RULEs now allow MULTI entries, which act as an OR list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/config/pmConfig.c

    r14744 r15116  
    44 *  @author EAM (IfA)
    55 *
    6  *  @version $Revision: 1.104 $ $Name: not supported by cvs2svn $
    7  *  @date $Date: 2007-09-05 02:30:30 $
     6 *  @version $Revision: 1.105 $ $Name: not supported by cvs2svn $
     7 *  @date $Date: 2007-09-29 22:18:39 $
    88 *
    99 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    823823
    824824
    825 // XXX aren't these (return false) below errors: call psError?
     825// does this header match the specified camera format?  answer is supplied to 'valid' the
     826// return value defines the error condition. error only on config errors
    826827bool pmConfigValidateCameraFormat(bool *valid, const psMetadata *cameraFormat, const psMetadata *header)
    827828{
     
    839840    }
    840841
    841     // Apply the rules
    842     psMetadataIterator *ruleIter = psMetadataIteratorAlloc(rule, PS_LIST_HEAD, NULL); // Rule iterator
    843     psMetadataItem *ruleItem = NULL;    // Item from the metadata
     842    // grab the metadata items in sequence by key so we get the MULTI entry
     843    psList *keyList = psMetadataKeys (rule);
     844    psArray *keys = psListToArray (keyList);
     845    if (! keys) {
     846        psError(PS_ERR_UNKNOWN, false, "Unable to read rule for camera.");
     847        *valid = false;
     848        return false;
     849    }
    844850
    845851    *valid = true;
    846     while (*valid && (ruleItem = psMetadataGetAndIncrement(ruleIter))) {
    847         // Check for the existence of the rule
     852    for (int i = 0; *valid && (i < keys->n); i++) {
     853
     854        // get the ruleItem for this key
     855        psMetadataItem *ruleItem = psMetadataLookup(rule, keys->data[i]);
     856
     857        // Check for the existence of the rule in the header
    848858        psMetadataItem *headerItem = psMetadataLookup(header, ruleItem->name);
    849859        if (! headerItem) {
     
    851861            psTrace("psModules.config", 5, "Can't find %s", ruleItem->name);
    852862            *valid = false;
    853         }
    854 
    855         // Check to see if the rule works
    856         if (headerItem && !psMetadataItemCompare(headerItem, ruleItem)) {
    857             psTrace("psModules.config", 5, "%s doesn't match.", ruleItem->name);
    858             *valid = false;
    859         }
    860     } // Iterating through the RULEs
    861 
    862     psFree(ruleIter);
     863            continue;
     864        }
     865
     866        // if the RULE type is a primitive type (int, float, etc) or string compare directly
     867        if (PS_DATA_IS_PRIMITIVE (ruleItem->type) || (ruleItem->type == PS_DATA_STRING)) {
     868            // Check to see if the rule works
     869            if (!psMetadataItemCompare(headerItem, ruleItem)) {
     870                psTrace("psModules.config", 5, "%s doesn't match.", ruleItem->name);
     871                *valid = false;
     872            }
     873            continue;
     874        }
     875
     876        // for MULTI, try each one & succeed if any match (valid = true is default state)
     877        if (ruleItem->type == PS_DATA_METADATA_MULTI) {
     878            bool found = false;
     879            for (int j = 0; j < ruleItem->data.list->n; j++) {
     880                psMetadataItem *entry = psListGet (ruleItem->data.list, j);
     881                assert (entry);
     882                if (psMetadataItemCompare(headerItem, entry)) {
     883                    found = true;
     884                    psTrace("psModules.config", 5, "%s in multi list matches.", ruleItem->name);
     885                    break;
     886                }
     887            }
     888            if (!found) {
     889                *valid = false;
     890                psTrace("psModules.config", 5, "%s doesn't match.", ruleItem->name);
     891            }
     892            continue;
     893        }
     894
     895        psError(PS_ERR_UNKNOWN, false, "Invalid type for RULE %s.", ruleItem->name);
     896        *valid = false;
     897        psFree (keyList);
     898        psFree (keys);
     899        return false;
     900    }
     901
     902    psFree (keyList);
     903    psFree (keys);
    863904    return true;
    864905}
     
    10961137    psMetadataItem *rulesItem = NULL;   // Item from iteration
    10971138    while ((rulesItem = psMetadataGetAndIncrement(rulesIter))) {
    1098         psMetadataItem *newItem = psMetadataItemCopy(rulesItem); // Copy of item
    1099         psMetadataAddItem(header, newItem, PS_LIST_TAIL, PS_META_REPLACE);
    1100         psFree(newItem);                // Drop reference
     1139        // this will insert each of the MULTI entries, writing over the previous copies
     1140        if (PS_DATA_IS_PRIMITIVE (rulesItem->type) || (rulesItem->type == PS_DATA_STRING)) {
     1141            psMetadataItem *newItem = psMetadataItemCopy(rulesItem); // Copy of item
     1142            psMetadataAddItem(header, newItem, PS_LIST_TAIL, PS_META_REPLACE);
     1143            psFree(newItem);                // Drop reference
     1144            continue;
     1145        }
     1146       
     1147        # if (0) // XXX not needed
     1148        // for MULTI entries, supply the first one
     1149        if (rulesItem->type == PS_DATA_METADATA_MULTI) {
     1150            psMetadataItem *entry = psListGet (rulesItem->data.list, PS_LIST_HEAD);
     1151            if (!entry) {
     1152                psError(PS_ERR_UNKNOWN, true, "No entries for MULTI RULE item.");
     1153                return false;
     1154            }
     1155            psMetadataItem *newItem = psMetadataItemCopy(entry); // Copy of item
     1156            psMetadataAddItem(header, newItem, PS_LIST_TAIL, PS_META_REPLACE);
     1157            psFree(newItem);                // Drop reference
     1158            continue;
     1159        }
     1160        # endif
     1161
     1162        psError(PS_ERR_UNKNOWN, false, "Invalid type for RULE %s.", rulesItem->name);
     1163        return false;
    11011164    }
    11021165    psFree(rulesIter);
Note: See TracChangeset for help on using the changeset viewer.