|
|
1.1 ! root 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: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.