|
yast2-core
|
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
1.7.3