home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / DOCTPL.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-24  |  5.0 KB  |  185 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1993, 1994 by Borland International, All Rights Reserved
  4. //
  5. //   Implementation of class TDocTemplate
  6. //----------------------------------------------------------------------------
  7. #pragma hdrignore SECTION
  8. #include <owl/owlpch.h>
  9. #include <owl/owldefs.h>
  10. #include <owl/doctpl.h>
  11.  
  12. //#define TemplatesSeized ((TDocTemplate*)1)  // template list taken by doc mgr
  13.  
  14. #if !defined(SECTION) || SECTION == 1
  15.  
  16. TDocTemplate::TDocTemplate(TRegList& regList, TModule*& module,
  17.                            TDocTemplate*& rptpl)
  18. :
  19.   TRegLink(regList, (TRegLink*&)rptpl),
  20.   Directory(0),
  21.   ModulePtr(&module)
  22. {
  23.   RefCnt = module ? 1 : 0x8001;  // static if contructed before Module
  24.   Flags = atol((*RegList)["docflags"]);
  25. }
  26.  
  27. void TDocTemplate::SetFlag(long flag)
  28. {
  29.   Flags = GetFlags() | flag;
  30. }
  31.  
  32. void TDocTemplate::ClearFlag(long flag)
  33. {
  34.   Flags = GetFlags() & ~flag;
  35. }
  36.  
  37. const char far* TDocTemplate::GetFileFilter() const
  38. {
  39.   return (*RegList)["docfilter"];
  40. }
  41.  
  42. const char far* TDocTemplate::GetDescription() const
  43. {
  44.   return (*RegList)["description"];
  45. }
  46.  
  47. const char far* TDocTemplate::GetDefaultExt() const
  48. {
  49.   return (*RegList)["extension"];
  50. }
  51.  
  52. const char far* TDocTemplate::GetDirectory() const
  53. {
  54.   if (Directory)
  55.     return Directory;
  56.   return (*RegList)["directory"];
  57. }
  58.  
  59. void TDocTemplate::SetDirectory(const char far* txt)
  60. {
  61.   delete [] Directory;
  62.   Directory = 0;
  63.   if (txt)
  64.     Directory = strnewdup(txt);
  65. }
  66.  
  67. void TDocTemplate::SetDirectory(const char far* txt, int len)
  68. {
  69.   delete [] Directory;
  70.   Directory = 0;
  71.   if (txt && len > 0) {
  72.     Directory = strnewdup(txt, len);
  73.     Directory[len] = 0;
  74.   }
  75. }
  76.  
  77. //
  78. // Called only when RefCnt goes to 0
  79. //
  80. TDocTemplate::~TDocTemplate()
  81. {
  82.   if (GetFlags() & dtDynRegInfo) {
  83.     delete RegList;
  84.     RegList = 0;
  85.   }
  86.   delete [] Directory;
  87. }
  88.  
  89. //----------------------------------------------------------------------------
  90. // Backward compatibility with old style doc templates
  91. //
  92. // The following three function vectors get reset by TDocManager constructor
  93. //
  94. static bool       SelectSaveX(TDocTemplate*, TDocument&) {return false;}
  95. static TView*     InitViewX(TView*) {return 0;}
  96. static TDocument* InitDocX(TDocTemplate&, TDocument*, const char far*, long)
  97.                                     {return 0;}
  98.  
  99. bool       (*TDocTemplate::SelectSave_)(TDocTemplate*,TDocument&) = SelectSaveX;
  100. TView*     (*TDocTemplate::InitView_)(TView*) = InitViewX;
  101. TDocument* (*TDocTemplate::InitDoc_)(TDocTemplate&, TDocument*,
  102.                                      const char far*, long) = InitDocX;
  103.  
  104. //
  105. // private class for backward compatibility
  106. //
  107. class TRegListOldDocTemplate : public TRegList {
  108.   public:
  109.     TRegListOldDocTemplate(const char* desc, const char* filt,
  110.                            const char* dir,  const char* ext, long flags);
  111.     TRegItem List[6];  // 4 strings, flags, terminator
  112.     char FlagBuf[12];  // for string representation of doc template flags
  113. };
  114.  
  115. TRegListOldDocTemplate::TRegListOldDocTemplate(const char* desc,
  116.                                                const char* filt,
  117.                                                const char* dir,
  118.                                                const char* ext,
  119.                                                long        flags)
  120. :
  121.   TRegList(List)
  122. {
  123.   wsprintf(FlagBuf,"0x%lX",flags);
  124.   List[0].Key = "description";
  125.   List[0].Value = desc;
  126.   List[1].Key = "docfilter";
  127.   List[1].Value = filt;
  128.   List[2].Key = "directory";
  129.   List[2].Value = dir;
  130.   List[3].Key = "extension";
  131.   List[3].Value = ext;
  132.   List[4].Key = "docflags";
  133.   List[4].Value = FlagBuf;
  134.   List[5].Key = 0;
  135. }
  136.  
  137. TDocTemplate::TDocTemplate(const char* desc, const char* filt,
  138.                            const char* dir, const char* ext,
  139.                            long flags, TModule*& module,
  140.                            TDocTemplate*& rphead)
  141. :
  142.   TRegLink(),
  143.   ModulePtr(&module),
  144.   Flags(flags | dtDynRegInfo)
  145. {
  146.   AddLink((TRegLink*&)rphead, *this);
  147.   RefCnt = module ? 1 : 0x8001;  // static if contructed before Module
  148. //  NextTemplate = 0;
  149.   RegList = new TRegListOldDocTemplate(desc, filt, dir, ext, flags);
  150. }
  151.  
  152. #endif
  153. #if !defined(SECTION) || SECTION == 2
  154.  
  155. IMPLEMENT_ABSTRACT_STREAMABLE(TDocTemplate);
  156.  
  157. void*
  158. TDocTemplate::Streamer::Read(ipstream& is, uint32 /*version*/) const
  159. {
  160.   TDocTemplate* o = GetObject();
  161.   bool wasStatic = o->IsStatic();  // test in case dummy template passed
  162.   is >> o->RefCnt;  // need to set back to 1 if doc attach increments!!?
  163.   is >> o->Flags;
  164.   if (o->IsStatic()) {
  165.     delete [] o->Directory;
  166.   }
  167.   o->Directory   = is.freadString();
  168.   if (o->IsStatic() && !wasStatic) {  // dummy template passed as sink
  169.     delete [] o->Directory;
  170.   }
  171.   return o;
  172.   //!JD need to link up reg info table!!
  173. }
  174.  
  175. void
  176. TDocTemplate::Streamer::Write(opstream& os) const
  177. {
  178.   TDocTemplate* o = GetObject();
  179.   os << o->RefCnt;
  180.   os << o->GetFlags();
  181.   os.fwriteString(o->Directory);
  182. }
  183.  
  184. #endif
  185.