File: DatBlock.h

package info (click to toggle)
capi4hylafax 1%3A01.02.03-10sarge2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 2,856 kB
  • ctags: 2,966
  • sloc: cpp: 20,126; sh: 7,703; makefile: 215; perl: 36
file content (118 lines) | stat: -rwxr-xr-x 3,592 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*---------------------------------------------------------------------------*\

    Copyright (C) 2000 AVM GmbH. All rights reserved.

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY, without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, and WITHOUT
    ANY LIABILITY FOR ANY DAMAGES arising out of or in connection
    with the use or performance of this software. See the
    GNU General Public License for further details.

\*---------------------------------------------------------------------------*/

#ifndef _DATBLOCK_H_
#define _DATBLOCK_H_

#include "DataPack.h"

/*===========================================================================*\
\*===========================================================================*/

class CDataPacketBlocks : public CDataPacket {
public:
    CDataPacketBlocks (tUInt BlockSize = 0);
    void SetBlockSize (tUInt BlockSize);

    void Init (CDataPacket *pPacket);
    void Init (tUByte *pPointer, tUInt Len, void *FirstHandle = 0);

    void FirstBlock (void);
    tBool NextBlock (void);
    tBool IsLastBlock (void);

private:
    tUByte *m_RealPointer;
    tUInt   m_RealMaxLen;
    tUInt   m_RealLen;
    tUInt   m_Delta;
    tUInt   m_Offset;
};

/*===========================================================================*\
    CDataPacketBlocks - inline functions
\*===========================================================================*/

inline CDataPacketBlocks::CDataPacketBlocks (tUInt BlockSize)
  : m_Delta (BlockSize),
    m_Offset (0),
    m_RealPointer (0),
    m_RealMaxLen (0),
    m_RealLen (0) {}

inline void CDataPacketBlocks::SetBlockSize (tUInt BlockSize) {
    m_Delta = BlockSize;
    FirstBlock();
}

inline void CDataPacketBlocks::Init (CDataPacket *pPacket) {
    // assert (pPacket != 0);
    m_RealPointer = pPacket->GetPointer();
    m_RealMaxLen  = pPacket->GetMaxLen();
    m_RealLen     = pPacket->GetLen();
    for (tUInt i = DATA_PACKET_HANDLE_COUNT; i > 0; i --) {
        SetHandle (pPacket->GetHandle (i), i);
    }
    FirstBlock();
}

inline void CDataPacketBlocks::Init (tUByte *pPointer, tUInt Len, void *FirstHandle) {
    m_RealPointer = pPacket->GetPointer();
    m_RealMaxLen  = pPacket->GetMaxLen();
    m_RealLen     = pPacket->GetLen();
    SetHandle (FirstHandle);
    FirstBlock();
}

inline void CDataPacketBlocks::FirstBlock (void) {
    SetPointer (m_RealPointer);
    m_Offset = 0;
    if (m_RealLen > m_Delta) {
        SetLen (m_Delta);
        SetMaxLen (m_Delta);
    } else {
        SetMaxLen (m_RealMaxLen);
        SetLen (m_RealLen);
    }
    SetPos (0);
}

inline tBool CDataPacketBlocks::NextBlock (void) {
    m_Offset += m_Delta;
    if (m_RealLen <= m_Offset) {
        FirstBlock();
        return vFalse;
    }
    SetPointer (m_RealPointer + m_Offset);
    if (m_RealLen <= m_Offset + m_Delta) {
        SetLen (m_RealLen - m_Offset);
        SetMaxLen (m_RealMaxLen - m_Offset);
    }
    SetPos (0);
    return vTrue;
}

inline tBool CDataPacketBlocks::IsLastBlock (void) {
    return (m_RealLen <= m_Offset + m_Delta) ? vTrue : vFalse;
}


/*===========================================================================*\
\*===========================================================================*/

#endif