Copyright © 1997 The California Institute of Technology
All rights reserved.

example1.cpp


  1 /*
  2 ** File
  3 **      example1.cpp
  4 **      Copyright 1997, The California Institute of Technology
  5 **
  6 ** Usage
  7 **      example1 <file type> <file name expression>...
  8 **
  9 ** Function
 10 **      Add the files named on the command line to FEI. Then retrieve them.
 11 **      Finally delete each one from FEI.
 12 **
 13 ** Creator
 14 **      J. Rector
 15 **
 16 ** Created
 17 **      June, 1997
 18 **
 19 ** History
 20 **
 21 */
 22 
 23 #include "Fei.h"
 24 #include <stdio.h>
 25 
 26 
 27 int main (int argc, char *argv[])
 28 {
 29    // Used for error messages
 30    char msg[256];
 31    int status = FEI_OK;
 32 
 33    int i;
 34 
 35    if (argc < 2)
 36    {
 37       fprintf (stderr, "\n%s <file type> <file name expression>...\n\n", argv[0]);
 38       return (FEI_INFO);
 39    }
 40 
 41    const char *fileType = argv[1];
 42 
 43    // Create an Fei object on the stack and connect to an FEI server
 44    // using the supplied file type. If the status is not 0 (FEI_OK),
 45    // return (exit). Use the FeiMsg reporting object to report messages.
 46    Fei fei;
 47    if ((status = fei.connect (fileType)) != FEI_OK)
 48       return (status);
 49    sprintf (msg, "\nConnected to Fei for file type \"%s\".", fileType);
 50    feiMsg().record (msg, FEI_INFO);
 51 
 52    // Each of the remaining command line arguments is a file to be added.
 53    // We use the Fei object defined for our target file type. We first
 54    // queue the transaction to the request queue and then wait on the result
 55    // queue for the file to be added. Each file is represented by an FeiProile
 56    // object that is returned to us. Once we're done with the object we
 57    // must delete it.
 58    FeiProfile *profile;
 59    for (i = 2; i < argc; i++)
 60    {
 61       if (status = fei.add (argv[i]))
 62       {
 63          status = FEI_ERROR;
 64          sprintf (msg, "Can't queue a request to add file \"%s\".", argv[i]);
 65          feiMsg().record (msg, status);
 66       }
 67       else
 68       {
 69          while ((profile = fei.result ()) != (FeiProfile *)NULL)
 70          {
 71             if (profile->getStatus() == FEI_OK)
 72             {
 73                sprintf (msg, "Added %s.", profile->getFileName ());
 74                feiMsg().record (msg, FEI_INFO);
 75             }
 76             else
 77             {
 78                // error recovery
 79             }
 80             // When were done with a profile record we must delete it.
 81             delete profile;
 82          }
 83       }
 84    }
 85 
 86    // Now get the files we just added and then delete them from FEI. 
 87    // We'll set an option so the existing files with the same name is
 88    // renamed with a version number before we actually write the new
 89    // file.
 90    const char *localPath = ".";  // write to current working directory
 91    fei.setOptions (feiVersion);
 92    for (i = 2; i < argc; i++)
 93    {
 94       if (status = fei.get (argv[i], localPath))
 95       {
 96          status = FEI_ERROR;
 97          sprintf (msg, "Can't queue a request to get file \"%s\".", argv[i]);
 98          feiMsg().record (msg, status);
 99          continue;
100       }
101       // Once we queue a request to get a file, queue a second request to
102       // delete the same file.
103       if (status = fei.remove (argv[i]))
104       {
105          status = FEI_ERROR;
106          sprintf (msg, "Can't queue a request to delete file \"%s\".",
107             argv[i]);
108          feiMsg().record (msg, status);
109          continue;
110       }
111       // We want both of the queued transactions to complete, so
112       // we check the transaction count and only leave the loop when
113       // it's 0. Initially it was 2.
114       char *command;
115       while (fei.transactions () > 0)
116       {
117          while ((profile = fei.result ()) != (FeiProfile *)NULL)
118          {
119             if (profile->getStatus() == FEI_OK)
120             {
121                // What type of command is associated with this profile?
122                if (profile->getCommand () == 'g')
123                   command = "got";
124                else if (profile->getCommand () == 'd')
125                   command = "deleted";
126                else
127                   command = "unknown";
128                sprintf (msg, "%s file %s.", command, profile->getFileName ());
129                feiMsg().record (msg, FEI_INFO);
130             }
131             else
132             {
133                // error recovery
134             }
135             delete profile;
136          }
137       }
138    }
139    // This isn't necessary, because the connection is closed when the Fei
140    // object goes out of scope, but we include it so you see how it fits in
141    // with the other calls in an FEI session. If we were going to connect
142    // again later using the same object, we'd need to use this member
143    // function and then reconnect later.
144    feiMsg().record ("Disconnecting from Fei.", FEI_INFO);
145    fei.disconnect ();
146 
147    return (status);
148 }


example1.cpp