Changeset 15116
- Timestamp:
- Sep 29, 2007, 12:18:39 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/config/pmConfig.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/config/pmConfig.c
r14744 r15116 4 4 * @author EAM (IfA) 5 5 * 6 * @version $Revision: 1.10 4$ $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 $ 8 8 * 9 9 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 823 823 824 824 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 826 827 bool pmConfigValidateCameraFormat(bool *valid, const psMetadata *cameraFormat, const psMetadata *header) 827 828 { … … 839 840 } 840 841 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 } 844 850 845 851 *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 848 858 psMetadataItem *headerItem = psMetadataLookup(header, ruleItem->name); 849 859 if (! headerItem) { … … 851 861 psTrace("psModules.config", 5, "Can't find %s", ruleItem->name); 852 862 *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); 863 904 return true; 864 905 } … … 1096 1137 psMetadataItem *rulesItem = NULL; // Item from iteration 1097 1138 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; 1101 1164 } 1102 1165 psFree(rulesIter);
Note:
See TracChangeset
for help on using the changeset viewer.
