scriptmenu.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // scriptmenu.cpp
  2. //
  3. // Copyright (C) 2007-2009, the Celestia Development Team
  4. //
  5. // Scan a directory and build a list of Celestia script files.
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #include "scriptmenu.h"
  12. #include "celutil/directory.h"
  13. #include "celutil/filetype.h"
  14. #include <fstream>
  15. using namespace std;
  16. static const string TitleTag("Title:");
  17. class ScriptScanner : public EnumFilesHandler
  18. {
  19. public:
  20.     ScriptScanner() :
  21.         menuItems(NULL)
  22.     {
  23.     }
  24.     bool process(const string& filename)
  25.     {
  26.         if (
  27. #ifdef CELX
  28.             DetermineFileType(filename) == Content_CelestiaScript ||
  29. #endif
  30.             DetermineFileType(filename) == Content_CelestiaLegacyScript
  31.             )
  32.         {
  33.             string filepath = getPath() + string("/") + filename;
  34.             // Scan the script file for metainformation. At the moment,
  35.             // the only thing searched for is the script title, which must
  36.             // appear on the first line after the string 'Title:'
  37.             ifstream in(filepath.c_str());
  38.             if (in.good())
  39.             {
  40.                 ScriptMenuItem item;
  41.                 item.filename = filepath;
  42.                 // Read the first line, handling various newline conventions
  43.                 char firstLineBuf[512];
  44.                 unsigned int count = 0;
  45.                 while (count < sizeof(firstLineBuf) - 1 && in.good())
  46.                 {
  47.                     int c = in.get();
  48.                     if (c == 'n' || c == 'r')
  49.                         break;
  50.                     firstLineBuf[count++] = c;
  51.                 }
  52.                 string firstLine(firstLineBuf, count);
  53.                 string::size_type titlePos = firstLine.find(TitleTag);
  54.                 // Skip spaces after the Title: tag
  55.                 if (titlePos != string::npos)
  56.                     titlePos = firstLine.find_first_not_of(" ", titlePos + TitleTag.length());
  57.                 if (titlePos != string::npos)
  58.                 {
  59.                     item.title = firstLine.substr(titlePos);
  60.                 }
  61.                 else
  62.                 {
  63.                     // No title tag--just use the filename
  64.                     item.title = filename;
  65.                 }
  66.                 menuItems->push_back(item);
  67.             }
  68.         }
  69.         return true;
  70.     }
  71.     vector<ScriptMenuItem>* menuItems;
  72. };
  73. std::vector<ScriptMenuItem>*
  74. ScanScriptsDirectory(string scriptsDir, bool deep)
  75. {
  76.     vector<ScriptMenuItem>* scripts = new vector<ScriptMenuItem>;
  77.     if (scripts == NULL)
  78.         return NULL;
  79.     Directory* dir = OpenDirectory(scriptsDir);
  80.     ScriptScanner scanner;
  81.     scanner.menuItems = scripts;
  82.     scanner.pushDir(scriptsDir);
  83.     dir->enumFiles(scanner, deep);
  84.     delete dir;
  85.     return scripts;
  86. }