|
|
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.