Xmlcode.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                                                                      |
00003 |                      __   __    ____ _____ ____                      |
00004 |                      \ \ / /_ _/ ___|_   _|___ \                     |
00005 |                       \ V / _` \___ \ | |   __) |                    |
00006 |                        | | (_| |___) || |  / __/                     |
00007 |                        |_|\__,_|____/ |_| |_____|                    |
00008 |                                                                      |
00009 |                               core system                            |
00010 |                                                        (C) SuSE GmbH |
00011 \----------------------------------------------------------------------/
00012 
00013    File:       Xmlcode.h
00014 
00015    Primitive xmlcode I/O functions.
00016    Acts as a namespace wrapper.
00017 
00018    Author:     Klaus Kaempf <kkaempf@suse.de>
00019    Maintainer: Klaus Kaempf <kkaempf@suse.de>
00020 
00021 /-*/
00022 // -*- c++ -*-
00023 
00024 #ifndef Xmlcode_h
00025 #define Xmlcode_h
00026 
00027 #include "ycp/YCPValue.h"
00028 #include "ycp/YCode.h"
00029 #include "ycp/YStatement.h"
00030 #include "ycp/YBlock.h"
00031 #include "ycp/Type.h"
00032 
00033 class Y2Namespace;
00034 
00035 #include <iosfwd>
00036 #include <string>
00037 #include <map>
00038 
00039 #include <fstream>
00040 
00042 class xmlcodeistream : public std::ifstream
00043 {
00044         int m_major, m_minor, m_release;
00045     public:
00046         xmlcodeistream (string filename);
00047         bool isVersion (int major, int minor, int revision);
00048         bool isVersionAtMost (int major, int minor, int revision);
00049         
00050         int major () const { return m_major; }
00051         int minor () const { return m_minor; }
00052         int release () const { return m_release; }
00053 };
00054 
00056 class Xmlcode {
00057     static int m_namespace_nesting_level;
00058     static int m_namespace_nesting_array_size;
00059     static int m_namespace_tare_level;
00060     
00062     struct namespaceentry_t {
00063         const Y2Namespace *name_space;
00064         bool with_xrefs;        
00065     };
00066     static namespaceentry_t *m_namespace_nesting_array;
00067     static map<string, YBlockPtr>* m_xmlcodeCache;
00068 
00069     public:
00071     class Invalid {};
00072 
00073         static string spaces( int count );
00074 
00075         static string xmlify( const string & s );
00076 
00077         // bytepointer I/O
00078         static std::ostream & writeBytep (std::ostream & streamref, const unsigned char * bytep, unsigned int len);
00079         static unsigned char * readBytep (xmlcodeistream & streamref);
00080 
00081         // Type I/O
00082         static std::ostream & writeType (std::ostream & str, constTypePtr type);
00083         static TypePtr readType (xmlcodeistream & str);
00084 
00085         // ycodelist_t * I/O
00086         static std::ostream & writeYCodelist (std::ostream & str, const ycodelist_t *codelist);
00087         static bool readYCodelist (xmlcodeistream & str, ycodelist_t **anchor);
00088 
00089         //-----------------------------------------------------------
00090         // block nesting handling
00091         //
00092         static void namespaceInit ();
00093         // retrieve ID (nesting level) for namespace
00094         static int namespaceId (const Y2Namespace *name_space);
00095         // retrieve namespace for ID
00096         static const Y2Namespace *namespacePtr (int namespace_id);
00097 
00098         // push given namespace to id stack, return new id, -1 on error
00099         static int pushNamespace (const Y2Namespace *name_space, bool with_xrefs = false);
00100 
00101         // pop given namespace from id stack, return namespace id, -1 on error
00102         static int popNamespace (const Y2Namespace *name_space);
00103 
00104         // pop all from id stack until given namespace is reached and popped too
00105         static void popUptoNamespace (const Y2Namespace *name_space);
00106 
00107         // reset current namespace stack to 'empty' for module loading
00108         //   returns a tare id needed later
00109         static int tareStack ();
00110         static void untareStack (int tare_id);
00111 
00112         //-----------------------------------------------------------
00113         // SymbolEntry pointer (!) handling
00114         //   the SymbolEntries itself are 'owned' by Y2Namespace (YBlock in YCP) and referenced via pointers
00115         //   to SymbolEntry. These functions handle stream I/O for SymbolEntry pointers.
00116         static std::ostream &writeEntry (std::ostream & str, const SymbolEntryPtr entry);
00117         static SymbolEntryPtr readEntry (xmlcodeistream & str);
00118 
00119         //-----------------------------------------------------------
00120         // YCode read.
00121         // Must be implemented outside of YCode since we have derived classes to allocate...
00122         // see YCode for write
00123         static YCodePtr readCode (xmlcodeistream & str);
00124 
00125         // File I/O
00126         // reading and writing complete files is done via separate functions
00127         // which add/check a 'magic value' header denoting "YCode" and its version.
00128 
00129         // read YCode from file in Module path, return YBlock (NULL in case of error)
00130         static YBlockPtr readModule (const string & mname);
00131 
00132         // read YCode from file, return YCode (YError in case of failure)
00133         static YCodePtr readFile (const string & filename);
00134 
00135         // write YCode to file, return true on success (check errno for errors)
00136         static bool writeFile (const YCodePtr code, const string & filename);
00137 };
00138 
00139 #endif // Xmlcode_h

Generated on Tue Nov 6 01:27:46 2007 for yast2-core by  doxygen 1.5.3