MythTV  0.27pre
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Groups Pages
mmembuf.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
4 **
5 ** This file is part of the Qt3Support module of the Qt Toolkit.
6 **
7 ** This file may be used under the terms of the GNU General Public
8 ** License versions 2.0 or 3.0 as published by the Free Software
9 ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
10 ** included in the packaging of this file. Alternatively you may (at
11 ** your option) use any later version of the GNU General Public
12 ** License if such license has been publicly approved by Trolltech ASA
13 ** (or its successors, if any) and the KDE Free Qt Foundation. In
14 ** addition, as a special exception, Trolltech gives you certain
15 ** additional rights. These rights are described in the Trolltech GPL
16 ** Exception version 1.2, which can be found at
17 ** http://www.trolltech.com/products/qt/gplexception/ and in the file
18 ** GPL_EXCEPTION.txt in this package.
19 **
20 ** Please review the following information to ensure GNU General
21 ** Public Licensing requirements will be met:
22 ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If
23 ** you are unsure which license is appropriate for your use, please
24 ** review the following information:
25 ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
26 ** or contact the sales department at sales@trolltech.com.
27 **
28 ** In addition, as a special exception, Trolltech, as the sole
29 ** copyright holder for Qt Designer, grants users of the Qt/Eclipse
30 ** Integration plug-in the right for the Qt/Eclipse Integration to
31 ** link to functionality provided by Qt Designer and its related
32 ** libraries.
33 **
34 ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
35 ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
36 ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly
37 ** granted herein.
38 **
39 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
40 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
41 **
42 ****************************************************************************/
43 
44 #include "mmembuf.h"
45 
46 // *******************************************************************
47 // QMembuf declaration and implementation
48 // *******************************************************************
49 
50 /* \internal
51  This class implements an efficient buffering of data that is often used by
52  asynchronous IO classes like QSocket, QHttp and QProcess.
53 */
54 
55 MMembuf::MMembuf() : _size(0), _index(0)
56 {
57 }
58 
60 {
61  while (!buf.isEmpty())
62  delete buf.takeFirst();
63 }
64 
70 bool MMembuf::consumeBytes(quint64 nbytes, char *sink)
71 {
72  if (nbytes <= 0 || (qint64)nbytes > _size)
73  return false;
74  _size -= nbytes;
75  while (!buf.isEmpty()) {
76  QByteArray *a = buf.first();
77  if ((int)(_index + nbytes) >= a->size()) {
78  // Here we skip the whole byte array and get the next later
79  int len = a->size() - _index;
80  if (sink) {
81  memcpy(sink, a->constData()+_index, len);
82  sink += len;
83  }
84  nbytes -= len;
85  buf.removeFirst();
86  delete a;
87  _index = 0;
88  if (nbytes == 0)
89  break;
90  } else {
91  // Here we skip only a part of the first byte array
92  if (sink)
93  memcpy(sink, a->constData()+_index, nbytes);
94  _index += nbytes;
95  break;
96  }
97  }
98  return true;
99 }
100 
108 bool MMembuf::scanNewline(QByteArray *store)
109 {
110  if (_size == 0)
111  return false;
112  int i = 0; // index into 'store'
113  QByteArray *a = 0;
114  char *p;
115  int n;
116  bool retval = false;
117  for (int j = 0; j < buf.size(); ++j) {
118  a = buf.at(j);
119  p = a->data();
120  n = a->size();
121  if (!j) {
122  // first buffer
123  p += _index;
124  n -= _index;
125  }
126  if (store) {
127  while (n-- > 0) {
128  *(store->data()+i) = *p;
129  if (++i == (int)store->size())
130  store->resize(store->size() < 256
131  ? 1024 : store->size()*4);
132  if (*p == '\n') {
133  retval = true;
134  goto end;
135  }
136  p++;
137  }
138  } else {
139  while (n-- > 0) {
140  if(*p == '\n')
141  return true;
142  p++;
143  }
144  }
145  }
146  end:
147  if (store)
148  store->resize(i);
149  return retval;
150 }
151 
152 int MMembuf::ungetch(int ch)
153 {
154  if (buf.isEmpty() || _index==0) {
155  // we need a new QByteArray
156  QByteArray *ba = new QByteArray;
157  ba->resize(1);
158  buf.prepend(ba);
159  _size++;
160  (*ba)[0] = ch;
161  } else {
162  // we can reuse a place in the buffer
163  QByteArray *ba = buf.first();
164  _index--;
165  _size++;
166  (*ba)[(int)_index] = ch;
167  }
168  return ch;
169 }