home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / ocfinc.pak / OCREG.H < prev    next >
C/C++ Source or Header  |  1997-07-23  |  15KB  |  361 lines

  1. //
  2. //----------------------------------------------------------------------------
  3. // ObjectComponents
  4. // (C) Copyright 1994 by Borland International, All Rights Reserved
  5. //
  6. //   OLE Registration definitions
  7. //----------------------------------------------------------------------------
  8. #if !defined(OCF_OCREG_H)
  9. #define OCF_OCREG_H
  10.  
  11. #if !defined(OCF_AUTODEFS_H)
  12. # include <ocf/autodefs.h>
  13. #endif
  14. #if !defined(OSL_GEOMETRY_H)
  15. # include <osl/geometry.h>  // defines TPointer
  16. #endif
  17. class _EXPCLASS istream;
  18. class _EXPCLASS ostream;
  19.  
  20. //____________________________________________________________________________
  21. //
  22. // TXRegistry - Windows Registry related exception object
  23. //____________________________________________________________________________
  24.  
  25. class TXRegistry : public TXBase {
  26.   public:
  27.     TXRegistry(const char* msg, const char* key);
  28.     TXRegistry(const TXRegistry& copy);
  29.     static void Check(long stat, const char* key);
  30.     const char* Key;
  31. };
  32. inline TXRegistry::TXRegistry(const char* msg, const char* key)
  33.             : TXBase(msg), Key(key) {}
  34. inline TXRegistry::TXRegistry(const TXRegistry& src)
  35.             : TXBase(src), Key(src.Key) {}
  36.  
  37. //____________________________________________________________________________
  38. //
  39. // Clipboard and registry data transfer format definitions
  40. //____________________________________________________________________________
  41.  
  42. const int ocrVerbLimit   = 8;  // maximum number of verbs registered per class
  43. const int ocrFormatLimit = 8;  // maximum number of data formats per class
  44.  
  45. // format: standard clipboard numeric format, or name of custom format
  46. //
  47. enum ocrClipFormat {
  48.   ocrText           =  1,  // CF_TEXT
  49.   ocrBitmap         =  2,  // CF_BITMAP
  50.   ocrMetafilePict   =  3,  // CF_METAFILEPICT
  51.   ocrSylk           =  4,  // CF_SYLK
  52.   ocrDif            =  5,  // CF_DIF
  53.   ocrTiff           =  6,  // CF_TIFF
  54.   ocrOemText        =  7,  // CF_OEMTEXT
  55.   ocrDib            =  8,  // CF_DIB
  56.   ocrPalette        =  9,  // CF_PALETTE
  57.   ocrPenData        = 10,  // CF_PENDATA
  58.   ocrRiff           = 11,  // CF_RIFF
  59.   ocrWave           = 12,  // CF_WAVE
  60.   ocrUnicodeText    = 13,  // CF_UNICODETEXT  Win32 only
  61.   ocrEnhMetafile    = 14,  // CF_ENHMETAFILE  Win32 only
  62. };
  63. #define ocrRichText          "Rich Text Format"
  64. #define ocrEmbedSource       "Embed Source"
  65. #define ocrEmbeddedObject    "Embedded Object"
  66. #define ocrLinkSource        "Link Source"
  67. #define ocrObjectDescriptor  "Object Descriptor"
  68. #define ocrLinkSrcDescriptor "Link Source Descriptor"
  69.  
  70. // aspect: view types supported by transfer
  71. //
  72. enum ocrAspect {
  73.   ocrContent   = 1,  // DVASPECT_CONTENT    normal display representation
  74.   ocrThumbnail = 2,  // DVASPECT_THUMBNAIL  picture appropriate for browser
  75.   ocrIcon      = 4,  // DVASPECT_ICON       iconized representation of object
  76.   ocrDocPrint  = 8,  // DVASPECT_DOCPRINT   print preview representation
  77. };
  78.  
  79. // medium: means of data transfer
  80. //
  81. enum ocrMedium {
  82.   ocrNull       = 0,
  83.   ocrHGlobal    = 1,  // TYMED_HGLOBAL  global memory handle
  84.   ocrFile       = 2,  // TYMED_FILE     data as contents of file
  85.   ocrIStream    = 4,  // TYMED_ISTREAM  instance of an IStream object
  86.   ocrIStorage   = 8,  // TYMED_ISTORAGE streams within an instance of IStorage
  87.   ocrGDI        = 16, // TYMED_GDI      GDI object in global handle
  88.   ocrMfPict     = 32, // TYMED_MFPICT   CF_METAFILEPICT containing global handle
  89.   ocrStaticMed  = 1024 // OLE 2 static object
  90. };
  91.  
  92. // direction: transfer directions supported
  93. //
  94. enum ocrDirection {
  95.   ocrGet    = 1,
  96.   ocrSet    = 2,
  97.   ocrGetSet = 3,
  98. };
  99.  
  100. //____________________________________________________________________________
  101. //
  102. // Miscellaneous registry definitions
  103. //____________________________________________________________________________
  104.  
  105. // IOleObject miscellaneous status flags, defined for each or all aspects
  106. //
  107. enum ocrObjectStatus {
  108.   ocrRecomposeOnResize           = 1,   // request redraw on container resize
  109.   ocrOnlyIconic                  = 2,   // only useful context view is Icon
  110.   ocrInsertNotReplace            = 4,   // should not replace current select.
  111.   ocrStatic                      = 8,   // object is an OLE static object
  112.   ocrCantLinkInside              = 16,  // should not be the link source
  113.   ocrCanLinkByOle1               = 32,  // only used in OBJECTDESCRIPTOR
  114.   ocrIsLinkObject                = 64,  // set by OLE2 link for OLE1 compat.
  115.   ocrInsideOut                   = 128, // can be activated concurrently
  116.   ocrActivateWhenVisible         = 256, // hint to cntnr when ocrInsideOut set
  117.   ocrRenderingIsDeviceIndependent= 512, // no decisions made based on target
  118.   ocrNoSpecialRendering          = 512, // older enum for previous entry
  119. };
  120.  
  121. // IOleObject verb menu flags
  122. //
  123. enum ocrVerbMenuFlags {
  124.   ocrGrayed      = 1,   // MF_GRAYED
  125.   ocrDisabled    = 2,   // MF_DISABLED
  126.   ocrChecked     = 8,   // MF_CHECKED
  127.   ocrMenuBarBreak= 32,  // MF_MENUBARBREAK
  128.   ocrMenuBreak   = 64,  // MF_MENUBAR
  129. };
  130.  
  131. // IOleObject verb attribute flags
  132. //
  133. enum ocrVerbAttributes {
  134.   ocrNeverDirties      = 1,   // verb can never cause object to become dirty
  135.   ocrOnContainerMenu   = 2,   // only useful context view is Icon
  136. };
  137.  
  138. // Entries for <usage> registration parameter, class factory registration mode
  139. //
  140. #define ocrSingleUse     "1"  // single client per instance
  141. #define ocrMultipleUse   "2"  // multiple clients per instance
  142. #define ocrMultipleLocal "3"  // multiple clients, separate inproc server
  143.  
  144.  
  145. long                                   // returns numeric value of <docflags>
  146. OcRegisterClass(TRegList& regInfo,     // obj holding array of reg parameters
  147.                 HINSTANCE hInst,       // 0 defaults to current task
  148.                 ostream& out,          // open ostream to stream reg entries
  149.                 TLangId lang,          // language for registration
  150.                 char* filter = 0,      // internal use to restrict entries
  151.                 TRegItem* defaults = 0,// optional registration default list
  152.                 TRegItem* extra = 0);  // optional registration override list
  153.  
  154. int                                   // returns error count, 0 if success
  155. OcUnregisterClass(TRegList& regInfo,  // registration table used for register
  156.                   TRegItem* extra=0); // optional additional regitration item
  157.  
  158. int OcRegistryValidate(istream& in);   // returns number of mismatched entires
  159.  
  160. void OcRegistryUpdate(istream& in);
  161.  
  162. int                   // return: 0=no debug reg, -1=user clsid, 1=default used
  163. OcSetupDebugReg(TRegList& regInfo,    // original registration list
  164.                 TRegItem* regDebug,   // temp override list[DebugReplaceCount]
  165.                 TLangId lang,         // language for registration
  166.                 char* clsid);         // default temp debug clsid string buf
  167. const int DebugRegCount = 4+1;        // replacements + room for terminator
  168. extern char AppDebugFilter[];         // templates needed for debug app reg
  169. extern char DocDebugFilter[];         // templates needed for debug doc reg
  170. extern TRegItem OcRegNoDebug[];       // override list to shut off "debugger"
  171. extern TRegItem OcRegNotDll[];        // override to shut off EXE-only items
  172.  
  173. //____________________________________________________________________________
  174. //
  175. // TRegistrar - Application registration manager interface class
  176. //____________________________________________________________________________
  177.  
  178. // application running mode and registration flags
  179. // these are initialized when processing command line or registration requests
  180. // the application's copy of the initial option flags is dynamically updated
  181. //
  182. enum TOcAppMode {
  183.   amRegServer    = 0x0001, // complete registration database update requested
  184.   amUnregServer  = 0x0002, // registration database unregistration requested
  185.   amAutomation   = 0x0004, // set from cmdline when EXE lauched for automation
  186.   amEmbedding    = 0x0008, // cmdline, overridden per Instance if embedded DLL
  187.   amLangId       = 0x0010, // user registration requested a particular LangId
  188.   amTypeLib      = 0x0020, // requested typelib to be generated and registered
  189.   amDebug        = 0x0040, // user requested launching for debugging
  190.   amNoRegValidate= 0x0080, // user request to suppress registry validation
  191.   amExeModule    = 0x0100, // set for EXE components, 0 if DLL inproc server
  192.   amExeMode      = 0x0200, // may be overridden per instance if running DLL
  193.   amServedApp    = 0x0400, // per instance flag, app refcnt held by container
  194.   amSingleUse    = 0x0800, // set from app reg, may be forced on per instance
  195.   amQuietReg     = 0x1000, // suppress error UI during registration processing
  196.   amRun          = 0x2000, // set in factory call to run application msg loop
  197.   amShutdown     = 0x4000, // set in factory call to shutdown/delete app
  198.   amAnyRegOption = amRegServer | amUnregServer | amTypeLib,
  199. };
  200.  
  201. typedef IUnknown*
  202. (*TComponentFactory)(IUnknown* outer, uint32 options, uint32 id = 0);
  203.  
  204. class _ICLASS TAppDescriptor;
  205.  
  206. class _ICLASS TRegistrar {
  207.   public:
  208.     TRegistrar(TRegList& regInfo, TComponentFactory callback,
  209.                string& cmdLine, HINSTANCE hInst = ::_hInstance);
  210.     virtual ~TRegistrar();
  211.     TUnknown* CreateAutoApp(TObjectDescriptor app, uint32 options,
  212.                             IUnknown* outer=0);
  213.     void      ReleaseAutoApp(TObjectDescriptor app);
  214.     TUnknown* CreateAutoObject(TObjectDescriptor doc, TServedObject& app,
  215.                                IUnknown* outer=0);
  216.     TUnknown* CreateAutoObject(const void* obj, const typeinfo& objInfo,
  217.                                const void* app, const typeinfo& appInfo,
  218.                                IUnknown* outer=0);
  219.     virtual void far* GetFactory(const GUID& clsid, const GUID far& iid);
  220.     virtual int       Run();   // run an instance of an app if it is an EXE
  221.     virtual void      Shutdown(IUnknown* releasedObj, uint32 options);
  222.     virtual bool      CanUnload();
  223.  
  224.     static TRegistrar* GetNext(TRegistrar* reg);// walk linked list of registrars
  225.  
  226.     // Registration management functions
  227.     void RegisterAppClass();
  228.     void UnregisterAppClass();
  229.  
  230.     // Command line options accessors
  231.     bool IsOptionSet(uint32 option) const;
  232.     uint32 GetOptions() const;
  233.     void SetOption(uint32 bit, bool state);
  234.     void ProcessCmdLine(string& cmdLine);
  235.  
  236.     TAppDescriptor& GetAppDescriptor() {return AppDesc;}  // internal use
  237.  
  238.   protected:
  239.     TRegistrar(TAppDescriptor& appDesc);
  240.     TAppDescriptor& AppDesc;
  241.  
  242.   private:
  243.     static TRegistrar* RegistrarList;  // linked list of registrar objects
  244.     TRegistrar* Next;                  // next link in registrar list
  245. };
  246.  
  247. //____________________________________________________________________________
  248. //
  249. //  Factory for automated OLE components, no linking/embedding support
  250. //____________________________________________________________________________
  251.  
  252. template <class T> class TOcAutoFactory {
  253.   public:
  254.     operator TComponentFactory() {return Create;}
  255.  
  256.     // Callouts to allow replacement of individual creation steps
  257.     //
  258.     static T*        CreateApp(HINSTANCE hInst, uint32 options);
  259.     static int       RunApp(T* app);
  260.     static void      DestroyApp(T* app);
  261.  
  262.     // Main Create callback function called to create app and/or object
  263.     //
  264.     static IUnknown* Create(IUnknown* outer, uint32 options, uint32 id);
  265. };
  266.  
  267.  
  268. //
  269. // Called when the app is not found and needs to be created
  270. //
  271. template <class T> T*
  272. TOcAutoFactory<T>::CreateApp(HINSTANCE hInst, uint32 options)
  273. {
  274.   T* app = new T(hInst, options);
  275.   return app;
  276. }
  277.  
  278. //
  279. // Called to run the application message loop if an EXE, or DLL in amExeMode
  280. //
  281. template <class T> int
  282. TOcAutoFactory<T>::RunApp(T* /*app*/)
  283. {
  284.   MSG msg;
  285.   while(GetMessage(&msg, 0, 0, 0)) {
  286.     TranslateMessage(&msg);
  287.     DispatchMessage(&msg);
  288.   }
  289.   return 0;
  290. }
  291.  
  292. //
  293. // Called to destroy the application previously created
  294. //
  295. template <class T> void
  296. TOcAutoFactory<T>::DestroyApp(T* app)
  297. {
  298.   delete app;
  299. }
  300.  
  301. //
  302. // Main Create callback function called to create app
  303. //
  304. template <class T> IUnknown*
  305. TOcAutoFactory<T>::Create(IUnknown* outer, uint32 options, uint32 /*id*/)
  306. {
  307.   static T* exeApp;     // used to hold EXE object until OLE factory call
  308.   T* app;
  309.   IUnknown* ifc = 0;
  310.   if (options & amShutdown)
  311.     return (options & amServedApp) ? 0 : outer;
  312.   if ((options & amAutomation) && (options & amServedApp)) {
  313.     app = exeApp;    // if EXE, retrieve app created on initial call from main
  314.   } else {
  315.     app = CreateApp(_hInstance, options);
  316.   }
  317.   if ((options & amAutomation) && !(options & amServedApp)) {
  318.     exeApp = app;    // if EXE, hold app until factory call when outer known
  319.   } else {
  320.     ifc = *::Registrar->CreateAutoApp(TAutoObjectDelete<T>(app),options,outer);
  321.   }
  322.   if (options & amRun) {
  323.     RunApp(app);
  324.     DestroyApp(app);
  325.   } // else DLL server, ifc will be released by controller, which deletes app
  326.   return ifc;
  327. }
  328.  
  329. //____________________________________________________________________________
  330.  
  331. #if !defined(OCF_APPDESC_H)
  332. # include <ocf/appdesc.h>  // private for inline implementation only
  333. #endif
  334.  
  335. inline TUnknown*
  336. TRegistrar::CreateAutoApp(TObjectDescriptor app, uint32 opts, IUnknown* outer)
  337.                              {return AppDesc.CreateAutoApp(app, opts, outer);}
  338. inline void
  339. TRegistrar::ReleaseAutoApp(TObjectDescriptor app)
  340.                                 {AppDesc.ReleaseAutoApp(app);}
  341. inline TUnknown*
  342. TRegistrar::CreateAutoObject(TObjectDescriptor doc, TServedObject& app,
  343.                              IUnknown* outer)
  344.                            {return AppDesc.CreateAutoObject(doc, app, outer);}
  345. inline TUnknown*
  346. TRegistrar::CreateAutoObject(const void* obj, const typeinfo& objInfo,
  347.                              const void* app, const typeinfo& appInfo,
  348.                              IUnknown* outer)
  349.          {return AppDesc.CreateAutoObject(obj, objInfo, app, appInfo, outer);}
  350. inline void TRegistrar::RegisterAppClass()    {AppDesc.RegisterClass();}
  351. inline void TRegistrar::UnregisterAppClass()  {AppDesc.UnregisterClass();}
  352. inline bool TRegistrar::IsOptionSet(uint32 option) const
  353.                                          {return AppDesc.IsOptionSet(option);}
  354. inline uint32 TRegistrar::GetOptions() const {return AppDesc.GetOptions();}
  355. inline void TRegistrar::SetOption(uint32 bit, bool state)
  356.                                               {AppDesc.SetOption(bit,state);}
  357. inline void TRegistrar::ProcessCmdLine(string& cmdLine)
  358.                                             {AppDesc.ProcessCmdLine(cmdLine);}
  359. #endif  // OCF_OCREG_H
  360.  
  361.