Version 3.6.0.4, tag libreoffice-3.6.0.4
[LibreOffice.git] / store / source / stordata.hxx
blob61625c32c046eb176f375df485be1e644c11b886
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * OpenOffice.org - a multi-platform office productivity suite
10 * This file is part of OpenOffice.org.
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
27 ************************************************************************/
29 #ifndef _STORE_STORDATA_HXX_
30 #define _STORE_STORDATA_HXX_
32 #include "sal/types.h"
33 #include "sal/macros.h"
35 #include "store/types.h"
36 #include "storbase.hxx"
38 namespace store
41 /*========================================================================
43 * OStoreDataPageData.
45 *======================================================================*/
46 #define STORE_MAGIC_DATAPAGE sal_uInt32(0x94190310)
48 struct OStoreDataPageData : public store::OStorePageData
50 typedef OStorePageData base;
51 typedef OStoreDataPageData self;
53 typedef OStorePageDescriptor D;
55 /** Representation.
57 sal_uInt8 m_pData[1];
59 /** type.
61 static const sal_uInt32 theTypeId = STORE_MAGIC_DATAPAGE;
63 /** size.
65 static const size_t theSize = 0;
66 static const sal_uInt16 thePageSize = base::theSize + self::theSize;
67 STORE_STATIC_ASSERT(STORE_MINIMUM_PAGESIZE >= self::thePageSize);
69 /** capacity.
71 static sal_uInt16 capacity (const D& rDescr) // @see inode::ChunkDescriptor
73 return (store::ntohs(rDescr.m_nSize) - self::thePageSize);
75 sal_uInt16 capacity() const
77 return self::capacity (base::m_aDescr);
80 /** usage.
82 sal_uInt16 usage() const
84 return (store::ntohs(base::m_aDescr.m_nUsed) - self::thePageSize);
87 /** Construction.
89 explicit OStoreDataPageData (sal_uInt16 nPageSize = self::thePageSize)
90 : base (nPageSize)
92 base::m_aGuard.m_nMagic = store::htonl(self::theTypeId);
93 base::m_aDescr.m_nUsed = store::htons(self::thePageSize);
94 if (capacity()) memset (m_pData, 0, capacity());
97 /** guard (external representation).
99 void guard() {}
101 /** verify (external representation).
103 storeError verify() const { return store_E_None; }
106 /*========================================================================
108 * OStoreDataPageObject.
110 *======================================================================*/
111 class OStoreDataPageObject : public store::OStorePageObject
113 typedef OStorePageObject base;
114 typedef OStoreDataPageData page;
116 public:
117 /** Construction.
119 explicit OStoreDataPageObject (PageHolder const & rxPage = PageHolder())
120 : OStorePageObject (rxPage)
123 /** External representation.
125 virtual storeError guard (sal_uInt32 nAddr);
126 virtual storeError verify (sal_uInt32 nAddr) const;
129 /*========================================================================
131 * OStoreIndirectionPageData.
133 *======================================================================*/
134 #define STORE_MAGIC_INDIRECTPAGE sal_uInt32(0x89191107)
136 struct OStoreIndirectionPageData : public store::OStorePageData
138 typedef OStorePageData base;
139 typedef OStoreIndirectionPageData self;
141 typedef OStorePageGuard G;
142 typedef OStorePageDescriptor D;
144 /** Representation.
146 G m_aGuard;
147 sal_uInt32 m_pData[1];
149 /** type.
151 static const sal_uInt32 theTypeId = STORE_MAGIC_INDIRECTPAGE;
153 /** size.
155 static const size_t theSize = sizeof(G);
156 static const sal_uInt16 thePageSize = base::theSize + self::theSize;
157 STORE_STATIC_ASSERT(STORE_MINIMUM_PAGESIZE >= self::thePageSize);
159 /** capacity.
161 static sal_uInt16 capacity (const D& rDescr)
163 return (store::ntohs(rDescr.m_nSize) - self::thePageSize);
165 sal_uInt16 capacity() const
167 return self::capacity (base::m_aDescr);
170 /** capacityCount.
172 static sal_uInt16 capacityCount (const D& rDescr) // @see DirectoryPageObject::scope()
174 return sal_uInt16(capacity(rDescr) / sizeof(sal_uInt32));
176 sal_uInt16 capacityCount() const
178 return sal_uInt16(capacity() / sizeof(sal_uInt32));
181 /** Construction.
183 explicit OStoreIndirectionPageData (sal_uInt16 nPageSize)
184 : base (nPageSize)
186 base::m_aGuard.m_nMagic = store::htonl(self::theTypeId);
187 base::m_aDescr.m_nUsed = store::htons(self::thePageSize);
188 self::m_aGuard.m_nMagic = store::htonl(0);
189 memset (m_pData, STORE_PAGE_NULL, capacity());
192 /** guard (external representation).
194 void guard()
196 sal_uInt32 nCRC32 = 0;
197 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
198 nCRC32 = rtl_crc32 (nCRC32, m_pData, capacity());
199 m_aGuard.m_nCRC32 = store::htonl(nCRC32);
202 /** verify (external representation).
204 storeError verify() const
206 sal_uInt32 nCRC32 = 0;
207 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
208 nCRC32 = rtl_crc32 (nCRC32, m_pData, capacity());
209 if (m_aGuard.m_nCRC32 != store::htonl(nCRC32))
210 return store_E_InvalidChecksum;
211 else
212 return store_E_None;
216 /*========================================================================
218 * OStoreIndirectionPageObject.
220 *======================================================================*/
221 class OStoreIndirectionPageObject : public store::OStorePageObject
223 typedef OStorePageObject base;
224 typedef OStoreIndirectionPageData page;
226 public:
227 /** Construction.
229 explicit OStoreIndirectionPageObject (PageHolder const & rxPage = PageHolder())
230 : OStorePageObject (rxPage)
233 /** External representation.
235 storeError loadOrCreate (
236 sal_uInt32 nAddr,
237 OStorePageBIOS & rBIOS);
239 virtual storeError guard (sal_uInt32 nAddr);
240 virtual storeError verify (sal_uInt32 nAddr) const;
242 /** read (indirect data page).
244 storeError read (
245 sal_uInt16 nSingle,
246 OStoreDataPageObject &rData,
247 OStorePageBIOS &rBIOS);
249 storeError read (
250 sal_uInt16 nDouble,
251 sal_uInt16 nSingle,
252 OStoreDataPageObject &rData,
253 OStorePageBIOS &rBIOS);
255 storeError read (
256 sal_uInt16 nTriple,
257 sal_uInt16 nDouble,
258 sal_uInt16 nSingle,
259 OStoreDataPageObject &rData,
260 OStorePageBIOS &rBIOS);
262 /** write (indirect data page).
264 storeError write (
265 sal_uInt16 nSingle,
266 OStoreDataPageObject &rData,
267 OStorePageBIOS &rBIOS);
269 storeError write (
270 sal_uInt16 nDouble,
271 sal_uInt16 nSingle,
272 OStoreDataPageObject &rData,
273 OStorePageBIOS &rBIOS);
275 storeError write (
276 sal_uInt16 nTriple,
277 sal_uInt16 nDouble,
278 sal_uInt16 nSingle,
279 OStoreDataPageObject &rData,
280 OStorePageBIOS &rBIOS);
282 /** truncate (indirect data page).
284 storeError truncate (
285 sal_uInt16 nSingle,
286 OStorePageBIOS &rBIOS);
288 storeError truncate (
289 sal_uInt16 nDouble,
290 sal_uInt16 nSingle,
291 OStorePageBIOS &rBIOS);
293 storeError truncate (
294 sal_uInt16 nTriple,
295 sal_uInt16 nDouble,
296 sal_uInt16 nSingle,
297 OStorePageBIOS &rBIOS);
300 /*========================================================================
302 * OStorePageNameBlock.
304 *======================================================================*/
305 struct OStorePageNameBlock
307 typedef OStorePageGuard G;
308 typedef OStorePageKey K;
310 /** Representation.
312 G m_aGuard;
313 K m_aKey;
314 sal_uInt32 m_nAttrib;
315 sal_Char m_pData[STORE_MAXIMUM_NAMESIZE];
317 /** size.
319 static const size_t theSize = sizeof(G) + sizeof(K) + sizeof(sal_uInt32) + sizeof(sal_Char[STORE_MAXIMUM_NAMESIZE]);
321 /** initialize.
323 void initialize (void)
325 m_aGuard = G();
326 m_aKey = K();
327 m_nAttrib = 0;
328 memset (m_pData, 0, sizeof(m_pData));
331 /** Construction.
333 OStorePageNameBlock (void)
334 : m_aGuard(), m_aKey(), m_nAttrib (0)
336 memset (m_pData, 0, sizeof(m_pData));
339 /** guard (external representation).
341 void guard()
343 sal_uInt32 nCRC32 = 0;
344 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
345 nCRC32 = rtl_crc32 (nCRC32, &m_aKey, theSize - sizeof(G));
346 m_aGuard.m_nCRC32 = store::htonl(nCRC32);
349 /** verify (external representation).
351 storeError verify() const
353 sal_uInt32 nCRC32 = 0;
354 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
355 nCRC32 = rtl_crc32 (nCRC32, &m_aKey, theSize - sizeof(G));
356 if (m_aGuard.m_nCRC32 != store::htonl(nCRC32))
357 return store_E_InvalidChecksum;
358 else
359 return store_E_None;
363 /*========================================================================
365 * OStoreDirectoryDataBlock.
367 *======================================================================*/
368 #define STORE_LIMIT_DATAPAGE_DIRECT 16
369 #define STORE_LIMIT_DATAPAGE_SINGLE 8
370 #define STORE_LIMIT_DATAPAGE_DOUBLE 1
371 #define STORE_LIMIT_DATAPAGE_TRIPLE 1
373 struct OStoreDirectoryDataBlock
375 typedef OStorePageGuard G;
377 /** LinkDescriptor.
379 struct LinkDescriptor
381 /** Representation.
383 sal_uInt16 m_nIndex0;
384 sal_uInt16 m_nIndex1;
385 sal_uInt16 m_nIndex2;
386 sal_uInt16 m_nIndex3;
388 /** Construction.
390 LinkDescriptor (void)
391 : m_nIndex0 ((sal_uInt16)(~0)),
392 m_nIndex1 ((sal_uInt16)(~0)),
393 m_nIndex2 ((sal_uInt16)(~0)),
394 m_nIndex3 ((sal_uInt16)(~0))
398 /** LinkTable.
400 struct LinkTable
402 /** Representation.
404 sal_uInt32 m_pDirect[STORE_LIMIT_DATAPAGE_DIRECT];
405 sal_uInt32 m_pSingle[STORE_LIMIT_DATAPAGE_SINGLE];
406 sal_uInt32 m_pDouble[STORE_LIMIT_DATAPAGE_DOUBLE];
407 sal_uInt32 m_pTriple[STORE_LIMIT_DATAPAGE_TRIPLE];
409 /** initialize.
411 void initialize (void)
413 memset(m_pDirect, STORE_PAGE_NULL, sizeof(m_pDirect));
414 memset(m_pSingle, STORE_PAGE_NULL, sizeof(m_pSingle));
415 memset(m_pDouble, STORE_PAGE_NULL, sizeof(m_pDouble));
416 memset(m_pTriple, STORE_PAGE_NULL, sizeof(m_pTriple));
419 /** Construction.
421 LinkTable (void)
423 initialize();
427 /** Representation.
429 G m_aGuard;
430 LinkTable m_aTable;
431 sal_uInt32 m_nDataLen;
433 /** size.
435 static const size_t theSize = sizeof(G) + sizeof(LinkTable) + sizeof(sal_uInt32);
437 /** initialize.
439 void initialize (void)
441 m_aGuard = G();
442 m_aTable.initialize();
443 m_nDataLen = 0;
446 /** Construction.
448 OStoreDirectoryDataBlock (void)
449 : m_aGuard(), m_aTable(), m_nDataLen (0)
452 /** guard (external representation).
454 void guard()
456 sal_uInt32 nCRC32 = 0;
457 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
458 nCRC32 = rtl_crc32 (nCRC32, &m_aTable, theSize - sizeof(G));
459 m_aGuard.m_nCRC32 = store::htonl(nCRC32);
462 /** verify (external representation).
464 storeError verify() const
466 sal_uInt32 nCRC32 = 0;
467 nCRC32 = rtl_crc32 (nCRC32, &m_aGuard.m_nMagic, sizeof(sal_uInt32));
468 nCRC32 = rtl_crc32 (nCRC32, &m_aTable, theSize - sizeof(G));
469 if (m_aGuard.m_nCRC32 != store::htonl(nCRC32))
470 return store_E_InvalidChecksum;
471 else
472 return store_E_None;
475 /** direct.
477 static sal_uInt16 directCount (void)
479 return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_DIRECT));
481 sal_uInt32 directLink (sal_uInt16 nIndex) const
483 if (nIndex < directCount())
484 return store::ntohl(m_aTable.m_pDirect[nIndex]);
485 else
486 return STORE_PAGE_NULL;
488 void directLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
490 if (nIndex < directCount())
491 m_aTable.m_pDirect[nIndex] = store::htonl(nAddr);
494 /** single.
496 static sal_uInt16 singleCount (void)
498 return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_SINGLE));
500 sal_uInt32 singleLink (sal_uInt16 nIndex) const
502 if (nIndex < singleCount())
503 return store::ntohl(m_aTable.m_pSingle[nIndex]);
504 else
505 return STORE_PAGE_NULL;
507 void singleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
509 if (nIndex < singleCount())
510 m_aTable.m_pSingle[nIndex] = store::htonl(nAddr);
513 /** double.
515 static sal_uInt16 doubleCount (void)
517 return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_DOUBLE));
519 sal_uInt32 doubleLink (sal_uInt16 nIndex) const
521 if (nIndex < doubleCount())
522 return store::ntohl(m_aTable.m_pDouble[nIndex]);
523 else
524 return STORE_PAGE_NULL;
526 void doubleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
528 if (nIndex < doubleCount())
529 m_aTable.m_pDouble[nIndex] = store::htonl(nAddr);
532 /** triple.
534 static sal_uInt16 tripleCount (void)
536 return ((sal_uInt16)(STORE_LIMIT_DATAPAGE_TRIPLE));
538 sal_uInt32 tripleLink (sal_uInt16 nIndex) const
540 if (nIndex < tripleCount())
541 return store::ntohl(m_aTable.m_pTriple[nIndex]);
542 else
543 return STORE_PAGE_NULL;
545 void tripleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
547 if (nIndex < tripleCount())
548 m_aTable.m_pTriple[nIndex] = store::htonl(nAddr);
552 /*========================================================================
554 * OStoreDirectoryPageData.
556 *======================================================================*/
557 #define STORE_MAGIC_DIRECTORYPAGE sal_uInt32(0x62190120)
559 struct OStoreDirectoryPageData : public store::OStorePageData
561 typedef OStorePageData base;
562 typedef OStoreDirectoryPageData self;
564 typedef OStorePageDescriptor D;
565 typedef OStorePageNameBlock NameBlock;
566 typedef OStoreDirectoryDataBlock DataBlock;
568 /** Representation.
570 NameBlock m_aNameBlock;
571 DataBlock m_aDataBlock;
572 sal_uInt8 m_pData[1];
574 /** type.
576 static const sal_uInt32 theTypeId = STORE_MAGIC_DIRECTORYPAGE;
578 /** size.
580 static const size_t theSize = NameBlock::theSize + DataBlock::theSize;
581 static const sal_uInt16 thePageSize = base::theSize + self::theSize;
582 STORE_STATIC_ASSERT(STORE_MINIMUM_PAGESIZE >= self::thePageSize);
584 /** capacity.
586 sal_uInt16 capacity() const
588 return (store::ntohs(base::m_aDescr.m_nSize) - self::thePageSize);
591 /** usage.
593 sal_uInt16 usage() const
595 return (store::ntohs(base::m_aDescr.m_nUsed) - self::thePageSize);
598 /** initialize.
600 void initialize (void)
602 base::m_aGuard.m_nMagic = store::htonl(self::theTypeId);
603 base::m_aDescr.m_nUsed = store::htons(self::thePageSize);
605 m_aNameBlock.initialize();
606 m_aDataBlock.initialize();
608 memset (m_pData, 0, capacity());
611 /** Construction.
613 explicit OStoreDirectoryPageData (sal_uInt16 nPageSize)
614 : base (nPageSize), m_aNameBlock(), m_aDataBlock()
616 base::m_aGuard.m_nMagic = store::htonl(self::theTypeId);
617 base::m_aDescr.m_nUsed = store::htons(self::thePageSize);
618 memset (m_pData, 0, capacity());
621 /** guard (external representation).
623 void guard()
625 m_aNameBlock.guard();
626 m_aDataBlock.guard();
629 /** verify (external representation).
631 storeError verify() const
633 storeError eErrCode = m_aNameBlock.verify();
634 if (eErrCode == store_E_None)
635 eErrCode = m_aDataBlock.verify();
636 return eErrCode;
639 /** ChunkDescriptor.
641 struct ChunkDescriptor
643 /** Representation.
645 sal_uInt32 m_nPage;
646 sal_uInt16 m_nOffset;
647 sal_uInt16 m_nLength;
649 /** Construction.
651 ChunkDescriptor (sal_uInt32 nPosition, sal_uInt16 nCapacity)
653 m_nPage = nPosition / nCapacity;
654 m_nOffset = (sal_uInt16)((nPosition % nCapacity) & 0xffff);
655 m_nLength = nCapacity - m_nOffset;
659 /** ChunkScope.
661 enum ChunkScope
663 SCOPE_INTERNAL,
664 SCOPE_EXTERNAL,
665 SCOPE_DIRECT,
666 SCOPE_SINGLE,
667 SCOPE_DOUBLE,
668 SCOPE_TRIPLE,
669 SCOPE_UNREACHABLE,
670 SCOPE_UNKNOWN
673 /** scope (internal).
675 ChunkScope scope (sal_uInt32 nPosition) const
677 sal_uInt32 nCapacity = capacity();
678 if (nPosition < nCapacity)
679 return SCOPE_INTERNAL;
680 else
681 return SCOPE_EXTERNAL;
685 /*========================================================================
687 * OStoreDirectoryPageObject.
689 *======================================================================*/
690 class OStoreDirectoryPageObject : public store::OStorePageObject
692 typedef OStorePageObject base;
693 typedef OStoreDirectoryPageData page;
694 typedef OStoreIndirectionPageData indirect;
696 typedef OStorePageDescriptor D;
698 public:
699 /** Construction.
701 explicit OStoreDirectoryPageObject (PageHolder const & rxPage = PageHolder())
702 : OStorePageObject (rxPage)
705 /** External representation.
707 virtual storeError guard (sal_uInt32 nAddr);
708 virtual storeError verify (sal_uInt32 nAddr) const;
710 /** attrib.
712 sal_uInt32 attrib (void) const
714 return store::ntohl(PAGE().m_aNameBlock.m_nAttrib);
716 void attrib (sal_uInt32 nAttrib)
718 PAGE().m_aNameBlock.m_nAttrib = store::htonl(nAttrib);
719 touch();
722 /** key.
724 OStorePageKey key (void) const
726 return PAGE().m_aNameBlock.m_aKey;
728 void key (OStorePageKey const & rKey)
730 PAGE().m_aNameBlock.m_aKey = rKey;
731 touch();
734 /** path.
736 sal_uInt32 path (void) const
738 page const & rPage = PAGE();
739 const sal_Char * pszName = rPage.m_aNameBlock.m_pData;
740 sal_uInt32 nPath = store::ntohl(rPage.m_aNameBlock.m_aKey.m_nHigh);
741 return rtl_crc32 (nPath, pszName, rtl_str_getLength(pszName));
744 sal_Size getName (sal_Char * pBuffer, sal_Size nBufsiz) const
746 sal_Char const * pszName = PAGE().m_aNameBlock.m_pData;
747 sal_Size nLength = rtl_str_getLength(pszName);
748 memcpy (pBuffer, pszName, SAL_MIN(nLength, nBufsiz));
749 return nLength;
752 /** dataLength.
754 sal_uInt32 dataLength (void) const
756 return store::ntohl(PAGE().m_aDataBlock.m_nDataLen);
758 void dataLength (sal_uInt32 nLength)
760 PAGE().m_aDataBlock.m_nDataLen = store::htonl(nLength);
761 touch();
764 /** direct.
766 sal_uInt32 directLink (sal_uInt16 nIndex) const
768 return PAGE().m_aDataBlock.directLink (nIndex);
770 void directLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
772 PAGE().m_aDataBlock.directLink (nIndex, nAddr);
773 touch();
776 /** single indirect.
778 sal_uInt32 singleLink (sal_uInt16 nIndex) const
780 return PAGE().m_aDataBlock.singleLink (nIndex);
782 void singleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
784 PAGE().m_aDataBlock.singleLink (nIndex, nAddr);
785 touch();
788 /** double indirect.
790 sal_uInt32 doubleLink (sal_uInt16 nIndex) const
792 return PAGE().m_aDataBlock.doubleLink (nIndex);
794 void doubleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
796 PAGE().m_aDataBlock.doubleLink (nIndex, nAddr);
797 touch();
800 /** triple indirect.
802 sal_uInt32 tripleLink (sal_uInt16 nIndex) const
804 return PAGE().m_aDataBlock.tripleLink (nIndex);
806 void tripleLink (sal_uInt16 nIndex, sal_uInt32 nAddr)
808 PAGE().m_aDataBlock.tripleLink (nIndex, nAddr);
809 touch();
812 /** read (external data page).
814 storeError read (
815 sal_uInt32 nPage,
816 OStoreDataPageObject &rData,
817 OStorePageBIOS &rBIOS);
819 /** write (external data page).
821 storeError write (
822 sal_uInt32 nPage,
823 OStoreDataPageObject &rData,
824 OStorePageBIOS &rBIOS);
826 /** truncate (external data page).
828 storeError truncate (
829 sal_uInt32 nPage,
830 OStorePageBIOS &rBIOS);
832 private:
833 /** Representation.
835 page & PAGE()
837 page * pImpl = static_cast<page*>(m_xPage.get());
838 OSL_PRECOND(pImpl != 0, "OStoreDirectoryPageObject::PAGE(): Null pointer");
839 return (*pImpl);
841 page const & PAGE() const
843 page const * pImpl = static_cast<page const *>(m_xPage.get());
844 OSL_PRECOND(pImpl != 0, "OStoreDirectoryPageObject::PAGE(): Null pointer");
845 return (*pImpl);
848 /** scope (external data page; private).
850 page::ChunkScope scope (
851 sal_uInt32 nPage,
852 page::DataBlock::LinkDescriptor &rDescr) const;
854 /** truncate (external data page scope; private).
856 storeError truncate (
857 page::ChunkScope eScope,
858 sal_uInt16 nRemain,
859 OStorePageBIOS &rBIOS);
862 /*========================================================================
864 * The End.
866 *======================================================================*/
868 } // namespace store
870 #endif /* !_STORE_STORDATA_HXX_ */
872 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */