1/*
2 * Copyright 2019-2020, Andrew Lindesay <apl@lindesay.co.nz>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#include "Captcha.h"
6
7#include <DataIO.h>
8
9#include "Logger.h"
10
11// These are keys that are used to store this object's data into a BMessage
12// instance.
13
14#define KEY_TOKEN			"token"
15#define KEY_PNG_IMAGE_DATA	"pngImageData"
16
17
18Captcha::Captcha(BMessage* from)
19	:
20	fToken(""),
21	fPngImageData(NULL)
22{
23	if (from->FindString(KEY_TOKEN, &fToken) != B_OK) {
24		HDERROR("expected key [%s] in the message data when creating a "
25			"captcha", KEY_TOKEN);
26	}
27
28	const void* data;
29	ssize_t len;
30
31	if (from->FindData(KEY_PNG_IMAGE_DATA, B_ANY_TYPE, &data, &len) != B_OK)
32		HDERROR("expected key [%s] in the message data", KEY_PNG_IMAGE_DATA);
33	else
34		SetPngImageData(data, len);
35}
36
37
38Captcha::Captcha()
39	:
40	fToken(""),
41	fPngImageData(NULL)
42{
43}
44
45
46Captcha::~Captcha()
47{
48	delete fPngImageData;
49}
50
51
52const BString&
53Captcha::Token() const
54{
55	return fToken;
56}
57
58
59BPositionIO*
60Captcha::PngImageData() const
61{
62	return fPngImageData;
63}
64
65
66void
67Captcha::SetToken(const BString& value)
68{
69	fToken = value;
70}
71
72
73void
74Captcha::SetPngImageData(const void* data, size_t len)
75{
76	if (fPngImageData != NULL)
77		delete fPngImageData;
78	fPngImageData = NULL;
79	if (data != NULL) {
80		fPngImageData = new BMallocIO();
81		fPngImageData->Write(data, len);
82	}
83}
84
85
86status_t
87Captcha::Archive(BMessage* into, bool deep) const
88{
89	status_t result = B_OK;
90	if (result == B_OK && into == NULL)
91		result = B_ERROR;
92	if (result == B_OK)
93		result = into->AddString(KEY_TOKEN, fToken);
94	if (result == B_OK && fPngImageData != NULL) {
95		result = into->AddData(KEY_PNG_IMAGE_DATA, B_ANY_TYPE,
96			fPngImageData->Buffer(), fPngImageData->BufferLength());
97	}
98	return result;
99}