home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK8 / MFC / SAMPLES / OSERVER / BIBDOC.CP$ / bibdoc
Encoding:
Text File  |  1992-03-19  |  5.7 KB  |  249 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and Microsoft
  7. // QuickHelp documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11.  
  12. #include "bibref.h"
  13. #include "bibdoc.h"
  14. #include "bibitem.h"
  15.  
  16. #include <malloc.h>
  17.  
  18. /////////////////////////////////////////////////////////////////////////////
  19.  
  20.  
  21. CBibDoc::CBibDoc(CListBox* pList,
  22.     const char* pszFileName, const char* pszSectionName)
  23. {
  24.     m_pList = pList;
  25.     m_pszFileName = pszFileName;        // Private INI file
  26.     m_pszSectionName = pszSectionName;
  27.  
  28.     m_pSelectedItem = NULL;     // no item yet
  29. }
  30.  
  31. BOOL CBibDoc::Load()
  32. {
  33.     int nDataSize;
  34.  
  35.     LPSTR lpBuffer = (LPSTR)_fmalloc(MAX_INI_FILE);
  36.     if (lpBuffer == NULL)
  37.         return FALSE;
  38.  
  39.     nDataSize = GetPrivateProfileString(m_pszSectionName,
  40.         NULL, "", lpBuffer, MAX_INI_FILE, m_pszFileName);
  41.  
  42.     if (nDataSize == 0) 
  43.     {
  44.         // no initial data or data corrupt
  45.         _ffree(lpBuffer);
  46.         return TRUE;
  47.     }
  48.  
  49.     if (nDataSize >= MAX_INI_FILE)
  50.     {
  51.         // no initial data or data corrupt
  52.         _ffree(lpBuffer);
  53.         return FALSE;
  54.     }
  55.  
  56.     LPSTR lpKey = lpBuffer;
  57.     // lpKey points to a list of string for the keys
  58.     while (*lpKey != '\0')
  59.     {
  60.         char szKey[OLE_MAXNAMESIZE*2];  // more than large enough
  61.         int cch = _fstrlen(lpKey);
  62.  
  63.         _fstrcpy(szKey, lpKey);
  64.         char* pchNext = &szKey[cch];
  65.         *pchNext++ = '\t';
  66.  
  67.         GetPrivateProfileString(m_pszSectionName,
  68.             lpKey, "", pchNext, sizeof(szKey)-2-cch, m_pszFileName);
  69.         lpKey += cch + 1;
  70.         m_pList->AddString(szKey);
  71.     }
  72.  
  73.     _ffree(lpBuffer);
  74.     return TRUE;
  75. }
  76.  
  77. /////////////////////////////////////////////////////////////////////////////
  78.  
  79. void CBibDoc::AddItem(const CString& key, const CString& value)
  80. {
  81.     CString both = key + "\t" + value;
  82.     m_pList->SetCurSel(m_pList->AddString(both));
  83.  
  84.     WritePrivateProfileString(m_pszSectionName, key, value, m_pszFileName);
  85. }
  86.  
  87. void CBibDoc::DeleteItem(const CString& key, int nIndex)
  88. {
  89.     ASSERT(nIndex != -1);
  90.     m_pList->DeleteString(nIndex);
  91.     WritePrivateProfileString(m_pszSectionName, key, NULL, m_pszFileName);
  92. }
  93.  
  94. /////////////////////////////////////////////////////////////////////////////
  95.  
  96. void CBibDoc::GetItemKeyValue(int nIndex, CString& key, CString& value)
  97. {
  98.     ASSERT(nIndex != -1);
  99.     CString both;
  100.     m_pList->GetText(nIndex, both);
  101.  
  102.     // tab character ('\t') separates key and value
  103.     int i = both.Find("\t");
  104.     if (i == -1)
  105.     {
  106.         // key only "<key>"
  107.         key = both;
  108.         value = "???";
  109.     }
  110.     else
  111.     {
  112.         // format is "<key> \t <value>"
  113.         key = both.Left(i);
  114.         value = both.Mid(i+1);
  115.     }
  116. }
  117.  
  118. int CBibDoc::GetItemValue(const CString& key, CString& value)
  119.     // return index or -1 if not found
  120. {
  121.     // we could either look in the listbox or the file
  122.     CString findString = key + "\t";
  123.     int nIndex = m_pList->FindString(-1, findString);
  124.     if (nIndex == -1)
  125.         return -1;
  126.  
  127.     CString key2;
  128.     GetItemKeyValue(nIndex, key2, value);
  129.     ASSERT(key2.CompareNoCase(key) == 0);   // same key (case insensitive)
  130.     return nIndex;
  131. }
  132.  
  133. /////////////////////////////////////////////////////////////////////////////
  134. // UI Specific
  135.  
  136. BOOL CBibDoc::ShowItem(const CString& key)
  137. {
  138.     CString findString = key + "\t";
  139.     int nIndex = m_pList->FindString(-1, findString);
  140.     if (nIndex == -1)
  141.     {
  142.         m_pList->SetCurSel(-1);
  143.         return FALSE;
  144.     }
  145.     m_pList->SetCurSel(nIndex);
  146.     return TRUE;
  147. }
  148.  
  149. /////////////////////////////////////////////////////////////////////////////
  150. // OLE Server functionality
  151.  
  152. BOOL CBibDoc::UpdateClient(const CString& string)
  153. {
  154.     if (m_pSelectedItem != NULL)
  155.     {
  156.         m_pSelectedItem->ChangeKey(string);
  157.     }
  158.     else
  159.     {
  160.         TRACE("Warning: UpdateClient with no item\n");
  161.     }
  162.     
  163.     TRACE("Notifying of saved\n");
  164.     NotifySaved();
  165.     return TRUE;
  166. }
  167.  
  168. COleServerItem* CBibDoc::OnGetDocument()
  169. {
  170.     TRACE("Creating an item to represent the entire (blank) document\n");
  171.     CBibItem* pItem = new CBibItem(NULL);
  172.     ASSERT(m_pSelectedItem == NULL);
  173.     m_pSelectedItem = pItem;
  174.     return pItem;
  175. }
  176.  
  177. COleServerItem* CBibDoc::OnGetItem(LPCSTR lpszObjname)
  178. {
  179.     CString key = lpszObjname;
  180.     TRACE("Doc::GetObject(%s)\n", (const char*)key);
  181.     CString findString = key + "\t";
  182.     int nIndex = m_pList->FindString(-1, findString);
  183.     if (nIndex == -1)
  184.     {
  185.         TRACE("couldn't find (%Fs)\n", lpszObjname);
  186.         return NULL;
  187.     }
  188.     
  189.     CBibItem* pItem = new CBibItem(key);
  190.     ASSERT(m_pSelectedItem == NULL);
  191.     m_pSelectedItem = pItem;
  192.     return pItem;
  193. }
  194.  
  195. COleServerItem* CBibDoc::GetNextItem(POSITION& rPosition)
  196. {
  197.     if (rPosition == NULL)
  198.     {
  199.         rPosition = (POSITION) 1;
  200.         return m_pSelectedItem;
  201.     }
  202.     else
  203.     {
  204.         return NULL;
  205.     }
  206. }
  207.  
  208. OLESTATUS CBibDoc::OnRelease()
  209. {
  210.     OLESTATUS status;
  211.     if ((status = COleServerDoc::OnRelease()) != OLE_OK)
  212.         return status;
  213.  
  214.     TRACE("Fake destroying CBibDoc\n");
  215.     //   don't do this -> delete this;
  216.     return OLE_OK;
  217. }
  218.  
  219. OLESTATUS CBibDoc::OnSetHostNames(LPCSTR lpszHost, LPCSTR lpszHostObj)
  220. {
  221.     // save host names in case needed later
  222.     m_strHost = lpszHost;
  223.     m_strHostObj = lpszHostObj;
  224.     return OLE_OK;
  225. }
  226.  
  227. /////////////////////////////////////////////////////////////////////////////
  228.  
  229. #ifdef _DEBUG
  230. void CBibDoc::AssertValid() const
  231. {
  232.     COleServerDoc::AssertValid();
  233.     ASSERT(m_pList != NULL);
  234. }
  235.  
  236.  
  237. void CBibDoc::Dump(CDumpContext& dc) const
  238. {
  239.     COleServerDoc::Dump(dc);
  240.     dc << "m_pList = " << m_pList << "\n";
  241.     dc << "m_pszFileName = " << m_pszFileName << "\n";
  242.     dc << "m_pszSectionName = " << m_pszSectionName << "\n";
  243.     dc << "m_pSelectedItem = " << m_pSelectedItem;
  244. }
  245.  
  246. #endif
  247.  
  248. /////////////////////////////////////////////////////////////////////////////
  249.