00001 
00025 #include "magic/mclass.h"
00026 #include "magic/mmap.h"
00027 #include "magic/mdatastream.h"
00028 
00029 BEGIN_NAMESPACE (MagiC);
00030 
00031 
00033 
00034 
00035 
00036 
00037 
00039 
00040 
00041 
00042 Class*  appclass = NULL;
00043 Class*  taskclass = NULL;
00044 
00045 
00046 Class::Class (const char* nam, const char* bases, GetClassInstance* getInstPtr){
00047     #ifdef MODULEDEBUG
00048     TRACE2 ("Class (%s, %s)", nam, bases);
00049     #endif
00050     name = nam;
00051     name.checksum ();
00052     
00053     
00054     
00055     
00056     mGetInstance = getInstPtr;
00057 
00058     if (bases) {
00059 
00060         
00061         String bases_str = bases;
00062         while (bases_str.length()>0 && (bases_str[0]=='{' || bases_str[0]=='"'))
00063             bases_str = bases_str.mid (1);
00064         while (bases_str.length()>0 && (bases_str[bases_str.length()-1]=='}' || bases_str[bases_str.length()-1]=='"'))
00065             bases_str.dellast (1);
00066 
00067         
00068         bases_str.split (parents_unfound, ',');
00069         for (int i=0; i<parents_unfound.size(); i++) {
00070             if ((parents_unfound[i] == "Application" ||
00071                  parents_unfound[i] == "HTMLQuery") &&
00072                 name != "HTMLQuery") {
00073                 appclass = this;
00074                 
00075             }
00076             if (parents_unfound[i] == "Task")
00077                 taskclass = this;
00078         }
00079     }
00080 
00081     
00082     
00083     ClassLib::insert (*this);
00084 }
00085 
00086 Class::~Class () {
00087     
00088     
00089 }
00090 
00091 void Class::printclassinfo (FILE* out) const {
00092     fprintf (out, "class %s",
00093             (CONSTR) name);
00094 
00095     
00096     if (parents_unfound.size() > 0) {
00097         fprintf (out, ": ");
00098         for (int i=0; i<parents_unfound.size(); i++) {
00099             fprintf (out, "%s", (CONSTR) parents_unfound[i]);
00100             if (i < parents_unfound.size() - 1)
00101                 fprintf (out, ",");
00102         }
00103     }
00104     fprintf (out, " {\n");
00105 
00106     
00107 
00108     
00109     
00110     Object* inst=NULL;
00111 
00112     DataOStream ar (out);
00113     ar << *inst;
00114     for (int i=0; i<ar.getattribs().size(); i++)
00115         fprintf (out, "\t%s;\n", (CONSTR) ar.getattribs()[i]);
00116     delete inst;
00117     fprintf (out, "};\n");
00118 }
00119 
00120 
00121 
00123 
00124 
00125 
00126 
00127 
00129 
00130 
00131 CMap<String,Class>* ClassLib::classes = NULL;
00132 
00133 void ClassLib::printclassinfo (const String& classname, FILE* out) {
00134     const Class* cls = classes->getp (classname);
00135     if (cls)
00136         cls->printclassinfo (out);
00137 }
00138 
00139 Class* ClassLib::getclass (const String& classname) {
00140     return classes->getvp (classname);
00141 }
00142 
00143 Object& ClassLib::getinstance (const String& classname) {
00144     
00145     Class* cls = classes->getvp (classname);
00146     if (cls)
00147         return *cls->getInstance();
00148     TRACE1("%%ERROR: No instance for '%s' found", (CONSTR) classname);
00149     return *(Object*)NULL;
00150 }
00151 
00152 void ClassLib::insert (Class& cls) {
00153     if (!classes)
00154         classes = new CMap<String,Class> (256, MAP_REF);
00155     
00156     classes->set (cls.name, cls);
00157 
00158     
00159     for (int i=0; i<cls.parents_unfound.size(); i++)
00160         ;
00161 }
00162 
00163 END_NAMESPACE;
00164