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