Exemple #1
0
def unescape_data(data):
    if cppunescape:
        return unescape(data)
    else:
        res = ''
        i = 0
        l = len(data)
        while i < l:
            c = data[i]
            i += 1
            if c == '\x1B':
                if not i < l:
                    raise UnescapeError('Short escape sequence')
                d = data[i]
                i += 1
                if d not in _UNESCAPE_MAP:
                    raise UnescapeError('Invalid escape sequence')
                c = _UNESCAPE_MAP[d]
            res += c
        return res
Exemple #2
0
    def process(self, lines, linesSoFar):
        # group non-empty lines together, empty lines replaced with null
        # eg. 'a\nb\n\nc\nd\n' -> [['a','b'],None,['c','d']]
        parts = linesplitter(lines)

        if len(parts)==0:
            _log.warn("no parts in %d lines?  %s", len(lines), lines[:5])
            return self._count

        for P in parts:
            if P is None:
                # new header will be next
                self.header = None
                continue

            elif len(P)==0:
                continue

            if not self.header:
                # first message in the stream
                self.header = H = PayloadInfo()
                H.ParseFromString(unescape(P[0]))
                try:
                    if H.year<0:
                        H.year = 1 # -1 when no samples available
                    self._year = calendar.timegm(datetime.date(H.year,1,1).timetuple())
                except ValueError:
                    _log.error("Error docoding header: %s %s %s", self.name, H.year, repr(P[0]))
                    raise
                P = P[1:]
            else:
                # use header from previous
                H = self.header

            Nsamp = len(P)
            if not Nsamp:
                continue # header w/o samples...

            elif self._count_limit and self._count+Nsamp>=self._count_limit:
                assert self._count < self._count_limit
                cnt = self._count_limit-self._count
                P = P[:cnt]
                Nsamp = len(P)

            try:
                V, M = decoders[H.type](P, self.cadiscon, self._year)
            except DecodeError as e:
                _log.error("Failed to decode sample %s %s %s", self.name,H.type,repr(e.args[0]))
                raise

            M = np.rec.array(M, dtype=dbr_time)

            M['sec'] += self._year

            #TODO: recheck _count_limit here as len(M)>=Nsamp due to
            #  disconnect events
            self._count += len(M)

            if len(M)==0:
                _log.warn("%s discarding 0 length array %s %s", self.name, V, M)
            else:
                #_log.debug("pushing %s samples: %s", V.shape, self.name)
                if self.inthread:
                    reactor.callFromThread(self._CB, V, M, *self._CB_args, **self._CB_kws)
                else:
                    D = self._CB(V, M, *self._CB_args, **self._CB_kws)
                    assert not isinstance(D, defer.Deferred), "appl does not support callbacks w/ deferred"

            if self._count_limit and self._count>=self._count_limit:
                _log.debug("%s count limit reached (%d,%d)", self.name,
                           self._count, self._count_limit)
                self.transport.stopProducing()
                break

        return self._count
Exemple #3
0
    def process(self, lines, linesSoFar):
        # group non-empty lines together, empty lines replaced with null
        # eg. 'a\nb\n\nc\nd\n' -> [['a','b'],None,['c','d']]
        parts = linesplitter(lines)

        if len(parts) == 0:
            _log.warn("no parts in %d lines?  %s", len(lines), lines[:5])
            return self._count

        for P in parts:
            if P is None:
                # new header will be next
                self.header = None
                continue

            elif len(P) == 0:
                continue

            if not self.header:
                # first message in the stream
                self.header = H = PayloadInfo()
                H.ParseFromString(unescape(P[0]))
                try:
                    if H.year < 0:
                        H.year = 1  # -1 when no samples available
                    self._year = calendar.timegm(
                        datetime.date(H.year, 1, 1).timetuple())
                except ValueError:
                    _log.error("Error docoding header: %s %s %s", self.name,
                               H.year, repr(P[0]))
                    raise
                P = P[1:]
            else:
                # use header from previous
                H = self.header

            Nsamp = len(P)
            if not Nsamp:
                continue  # header w/o samples...

            elif self._count_limit and self._count + Nsamp >= self._count_limit:
                assert self._count < self._count_limit
                cnt = self._count_limit - self._count
                P = P[:cnt]
                Nsamp = len(P)

            try:
                V, M = decoders[H.type](P, self.cadiscon, self._year)
            except DecodeError as e:
                _log.error("Failed to decode sample %s %s %s", self.name,
                           H.type, repr(e.args[0]))
                raise

            M = np.rec.array(M, dtype=dbr_time)

            M['sec'] += self._year

            #TODO: recheck _count_limit here as len(M)>=Nsamp due to
            #  disconnect events
            self._count += len(M)

            if len(M) == 0:
                _log.warn("%s discarding 0 length array %s %s", self.name, V,
                          M)
            else:
                #_log.debug("pushing %s samples: %s", V.shape, self.name)
                if self.inthread:
                    reactor.callFromThread(self._CB, V, M, *self._CB_args,
                                           **self._CB_kws)
                else:
                    D = self._CB(V, M, *self._CB_args, **self._CB_kws)
                    assert not isinstance(
                        D, defer.Deferred
                    ), "appl does not support callbacks w/ deferred"

            if self._count_limit and self._count >= self._count_limit:
                _log.debug("%s count limit reached (%d,%d)", self.name,
                           self._count, self._count_limit)
                self.transport.stopProducing()
                break

        return self._count