mummy  1.0.2
MummyCsharpGenerator.h
Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00002 // MummyCsharpGenerator.h
00003 //
00004 // Author(s) : David Cole
00005 //
00006 // Copyright (C) 2006-2008 Kitware, Inc.
00007 //----------------------------------------------------------------------------
00008 
00009 #ifndef _MummyCsharpGenerator_h_
00010 #define _MummyCsharpGenerator_h_
00011 
00012 #include "MummyGenerator.h" // parent class
00013 
00014 #include "gxsys/stl/map"
00015 #include "gxsys/stl/string"
00016 #include "gxsys/stl/vector"
00017 
00018 class MummyCsharpGenerator : public MummyGenerator
00019 {
00020 public:
00021   MummyCsharpGenerator();
00022   virtual ~MummyCsharpGenerator();
00023 
00024   virtual void SetTargetClass(const cable::Class *c);
00025   virtual void CacheExternalHints(const gxsys_stl::string& hintsfile);
00026 
00027   virtual void AddTargetInterface(const gxsys_stl::string& iface);
00028   virtual bool HasTargetInterface(const char *iface) const;
00029 
00030   virtual bool IsKeyword(const char *p);
00031   virtual bool IsReservedMethodName(const gxsys_stl::string &name);
00032   virtual gxsys_stl::string GetFundamentalTypeString(const cable::Type *t);
00033   virtual gxsys_stl::string GetWrappedMethodName(const cable::Method *m);
00034   virtual gxsys_stl::string GetMethodArgumentArraySize(const cable::Class *c, const cable::Method *m, const cable::FunctionType *ft, unsigned int i);
00035   virtual gxsys_stl::string GetMethodSignature(const cable::Class *c, const cable::Method *m);
00036   virtual const char *GetArgName(cable::FunctionType *ftype, unsigned int i);
00037   virtual bool GetIsRefArg(const cable::Type *t);
00038   virtual gxsys_stl::string GetPInvokeTypeString(const cable::Type *t, bool forReturn, bool isArray, bool forDelegate);
00039   virtual gxsys_stl::string GetCSharpTypeString(const cable::Type *t, bool forReturn, bool isArray);
00040   virtual void ClearLookupEntries();
00041   virtual void AddLookupEntries(const cable::Class* c);
00042   virtual void DumpLookupEntries();
00043   virtual bool OtherMethodRedefined(const gxsys_stl::string &signature);
00044   virtual bool StaticMethodRedefined(const gxsys_stl::string &signature);
00045   virtual bool VirtualMethodOverridden(const gxsys_stl::string &signature);
00046   virtual bool WrappedMethodExists(const gxsys_stl::string &signature);
00047   virtual bool WrappedEnumExists(const gxsys_stl::string &name);
00048 
00049   virtual bool FundamentalTypeIsWrappable(const cable::Type* t);
00050   virtual bool TypeIsWrappable(const cable::Type* t);
00051   virtual bool FunctionTypeIsWrappable(const cable::FunctionType* ft);
00052   virtual bool MethodWrappableAsEvent(const cable::Method* m, const cable::Context::Access& access);
00053   virtual bool MethodIsWrappable(const cable::Method* m, const cable::Context::Access& access);
00054   virtual bool ClassIsWrappable(const cable::Class* c);
00055   virtual const cable::Class* GetWrappableParentClass(const cable::Class *c);
00056 
00057   virtual bool IsFactoryMethod(const cable::Class *c, const cable::Method *m);
00058   virtual bool IsDisposalMethod(const cable::Class *c, const cable::Method *m);
00059   virtual bool MethodReturnValueIsCounted(const cable::Class *c, const cable::Method *m);
00060   virtual gxsys_stl::string GetExportLayerFunctionName(const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname);
00061   virtual void EmitCSharpMethodDeclaration(gxsys_ios::ostream &os, const cable::Class *c, const cable::Method *m, bool asProperty, bool useArg0AsReturn, const gxsys_stl::string& accessLevel);
00062   virtual void EmitCSharpDllImportDeclaration(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname, const char *f, bool emitExceptionParams);
00063   virtual void EmitCSharpProperty(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *propGetMethod, const cable::Method *propSetMethod, bool emitExceptionParams);
00064   virtual void EmitCSharpMethodBody(gxsys_ios::ostream &os, unsigned int indent, const cable::Class *c, const cable::Method *m, gxsys_stl::string& f, const char *impliedArg0, bool emitExceptionParams);
00065   virtual void EmitCSharpMethod(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname, const gxsys_stl::string& accessLevel, bool emitExceptionParams);
00066   virtual void EmitCSharpEvent(gxsys_ios::ostream& os, const char *dllname, const cable::Class* c, const cable::Method* m, const gxsys_stl::string& eventName);
00067   virtual void EmitCSharpEnums(gxsys_ios::ostream &os, const cable::Class *c);
00068   virtual void EmitCSharpConstructor(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname, bool emitExceptionParams);
00069   virtual void EmitCSharpRegister(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname, bool emitExceptionParams);
00070   virtual void EmitCSharpDispose(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c, const cable::Method *m, const gxsys_stl::string& mname, const unsigned int eventCount, bool emitExceptionParams);
00071   virtual void EmitCSharpWrapperClassAsStruct(gxsys_ios::ostream &os, const cable::Class *c);
00072   virtual void GatherWrappedMethods(
00073     const cable::Class *c,
00074     gxsys_stl::vector<cable::Method*>& wrapped_methods,
00075     cable::Method*& factoryM,
00076     cable::Method*& disposalM,
00077     cable::Method*& registerM,
00078     cable::Method*& unRegisterM,
00079     bool includeParentMethods
00080     );
00081   virtual bool ValidateWrappedMethods(
00082     const cable::Class *c,
00083     gxsys_stl::vector<cable::Method*>& wrapped_methods,
00084     cable::Method*& factoryM,
00085     cable::Method*& disposalM,
00086     cable::Method*& registerM,
00087     cable::Method*& unRegisterM
00088     );
00089   virtual void BuildPropGetsAndSetsMap(
00090     gxsys_stl::vector<cable::Method*>& wrapped_methods,
00091     gxsys_stl::map<gxsys_stl::string, gxsys_stl::pair<cable::Method*, cable::Method*> >& wrapped_properties
00092     );
00093   virtual void EmitCSharpWrapperClass(gxsys_ios::ostream &os, const char *dllname, const cable::Class *c);
00094 
00095 protected:
00096   // Provide implementation for inherited pure virtuals:
00097   virtual bool GenerateWrappers();
00098 
00099 private:
00100   unsigned int CurrentMethodId;
00101   unsigned int ClassLineNumber;
00102   gxsys_stl::map<const cable::Method*, unsigned int> MethodIdMap;
00103   gxsys_stl::string TargetInterface;
00104   gxsys_stl::map<const gxsys_stl::string, gxsys_stl::string> HintsMap;
00105 
00106   MummyCsharpGenerator(const MummyCsharpGenerator&); //Not implemented
00107   MummyCsharpGenerator& operator=(const MummyCsharpGenerator&); //Not implemented
00108 };
00109 
00110 #endif