1/*
2 * Copyright 2023, Andrew Lindesay <apl@lindesay.co.nz>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5
6
7#include "ChecksumJsonEventListener.h"
8
9
10ChecksumJsonEventListener::ChecksumJsonEventListener(int32 checksumLimit)
11	:
12	fChecksum(0),
13	fChecksumLimit(checksumLimit),
14	fError(B_OK),
15	fCompleted(false)
16{
17}
18
19
20ChecksumJsonEventListener::~ChecksumJsonEventListener()
21{
22}
23
24
25bool
26ChecksumJsonEventListener::Handle(const BJsonEvent& event)
27{
28	if (fCompleted || B_OK != fError)
29		return false;
30
31	switch (event.EventType()) {
32		case B_JSON_NUMBER:
33		{
34			const char* content = event.Content();
35			_ChecksumProcessCharacters(content, strlen(content));
36			break;
37		}
38		case B_JSON_STRING:
39		case B_JSON_OBJECT_NAME:
40		{
41			const char* content = event.Content();
42			_ChecksumProcessCharacters(content, strlen(content));
43			break;
44		}
45		default:
46			break;
47	}
48
49	return true;
50}
51
52
53void
54ChecksumJsonEventListener::HandleError(status_t status, int32 line, const char* message)
55{
56	fError = status;
57}
58
59
60void
61ChecksumJsonEventListener::Complete()
62{
63	fCompleted = true;
64}
65
66
67uint32
68ChecksumJsonEventListener::Checksum() const
69{
70	return fChecksum;
71}
72
73
74status_t
75ChecksumJsonEventListener::Error() const
76{
77	return fError;
78}
79
80
81void
82ChecksumJsonEventListener::_ChecksumProcessCharacters(const char* content, size_t len)
83{
84	for (size_t i = 0; i < len; i++) {
85		fChecksum = (fChecksum + static_cast<int32>(content[i])) % fChecksumLimit;
86	}
87}
88