Index: trunk/psModules/src/camera/pmFPAfileDefine.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 11242)
+++ trunk/psModules/src/camera/pmFPAfileDefine.c	(revision 11255)
@@ -106,4 +106,16 @@
 }
 
+// Check the various levels for file operations to make sure that they are suitable based on the format
+static void adjustLevels(pmFPAfile *file, // File for which to adjust levels
+                         const psMetadata *format // Format to use to adjust levels
+                        )
+{
+    assert(file);
+    assert(format);
+
+
+    return;
+}
+
 // define a pmFPAfile, bind to the optional fpa if supplied
 pmFPAfile *pmFPAfileDefineOutput(pmConfig *config, pmFPA *fpa, const char *name)
@@ -167,11 +179,45 @@
     }
 
-    file->fileLevel = pmFPALevelFromName(psMetadataLookupStr(&status, data, "FILE.LEVEL"));
+    file->camera = psMemIncrRefCounter(config->camera);
+    const char *formatName = psMetadataLookupStr (&status, data, "FILE.FORMAT");
+    psMetadata *format = NULL;          // Camera format to use
+    if (formatName && strcasecmp(formatName, "NONE") != 0) {
+        // select the format list from the selected camera
+        psMetadata *formats = psMetadataLookupMetadata(&status, file->camera, "FORMATS"); // List of formats
+
+        // select the desired format
+        format = psMetadataLookupMetadata(&status, formats, formatName);
+        if (!format) {
+            psError(PS_ERR_IO, false, "format %s for %s not defined", formatName, name);
+            psFree(file);
+            return NULL;
+        }
+        file->format = psMemIncrRefCounter(format);
+        #if 0
+
+        file->src = psMemIncrRefCounter(fpa);
+        file->fpa = pmFPAConstruct(file->camera);
+        #endif
+
+    } else {
+        format = config->format;
+        #if 0
+
+        file->fpa = psMemIncrRefCounter(fpa);
+        #endif
+
+    }
+    #if 1
+    file->fpa = psMemIncrRefCounter(fpa);
+    #endif
+
+
+    file->fileLevel = pmFPAPHULevel(format);
     if (file->fileLevel == PM_FPA_LEVEL_NONE) {
-        psError(PS_ERR_IO, true, "FILE.LEVEL is not set for %s\n", name);
-        return NULL;
-    }
-
-    file->dataLevel = pmFPALevelFromName(psMetadataLookupStr (&status, data, "DATA.LEVEL"));
+        psError(PS_ERR_IO, true, "Unable to determine file level for %s\n", name);
+        return NULL;
+    }
+
+    file->dataLevel = pmFPALevelFromName(psMetadataLookupStr(&status, data, "DATA.LEVEL"));
     if (file->dataLevel == PM_FPA_LEVEL_NONE) {
         psError(PS_ERR_IO, true, "DATA.LEVEL is not set for %s\n", name);
@@ -182,57 +228,21 @@
     file->freeLevel = file->dataLevel;
 
-    if (fpa != NULL) {
-        file->fpa = psMemIncrRefCounter(fpa);
-    }
-
-    #if 0
-    // for WRITE type of data, the output format needs to be determined
-    // this is only needed if the output file is not identical in structure to the input?
-    // for
-    char *formatLine = psMetadataLookupStr (&status, data, "FILE.FORMAT");
-    if (formatLine && strcasecmp (formatLine, "NONE")) {
-
-        char *formatName = NULL;
-
-        psArray *words = psStringSplitArray (formatLine, ":", false);
-        if (!words || !words->n) {
-            psAbort("pmFPAfileDefine", "programming error: cannot be NULL or empty!");
-        }
-        if (words->n == 1) {
-            // format selected in this camera
-            formatName = formatLine;
-            file->camera = psMemIncrRefCounter (config->camera);
-        }
-        if (words->n == 2) {
-            // select the requested camera
-            formatName = words->data[1];
-            file->camera = pmConfigCameraByName(config, words->data[0]);
-            // XXX do we need to save the camera name?
-            if (!file->camera) {
-                psError(PS_ERR_IO, false, "camera %s not found\n", (char *)words->data[0]);
-                psFree(words);
-                return NULL;
-            }
-        }
-
-        // select the format list from the selected camera
-        psMetadata *formats = psMetadataLookupMetadata(&status, file->camera, "FORMATS"); // List of formats
-
-        // select the desired format
-        char *formatFile = psMetadataLookupStr (&status, formats, formatName);
-        if (!formatFile) {
-            psError(PS_ERR_IO, false, "format %s for %s not defined", formatName, name);
-            psFree (file);
-            psFree (words);
-            return NULL;
-        }
-        pmConfigFileRead(&file->format, formatFile, formatName);
-        psFree (words);
-    }
-    #endif
+    pmFPALevel extLevel = pmFPAExtensionsLevel(format); // Level for extensions
+    if (extLevel != PM_FPA_LEVEL_NONE) {
+        if (extLevel < file->dataLevel) {
+            psWarning("Level for extensions is higher than desired data level --- adjusting.\n");
+            file->dataLevel = extLevel;
+        }
+        if (extLevel < file->freeLevel) {
+            psWarning("Level for extensions is higher than desired free level --- adjusting.\n");
+            file->freeLevel = extLevel;
+        }
+    }
+    adjustLevels(file, format);
+
 
     // add argument-supplied OUTPUT name to this file
     char *outname = psMetadataLookupStr(&status, config->arguments, "OUTPUT");
-    psMetadataAddStr (file->names, PS_LIST_TAIL, "OUTPUT", PS_META_NO_REPLACE, "", outname);
+    psMetadataAddStr(file->names, PS_LIST_TAIL, "OUTPUT", PS_META_NO_REPLACE, "", outname);
 
     // place the resulting file in the config system
@@ -241,4 +251,5 @@
     return (file); // the returned value is a view into the version on 'files'
 }
+
 
 // search for argname on the config->argument list
