xref: /haiku/src/kits/package/FetchUtils.cpp (revision 4c8e85b316c35a9161f5a1c50ad70bc91c83a76f)
1 /*
2  * Copyright 2020, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 
10 #include "FetchUtils.h"
11 #include "string.h"
12 
13 #include <Entry.h>
14 #include <Node.h>
15 #include <TypeConstants.h>
16 
17 namespace BPackageKit {
18 
19 namespace BPrivate {
20 
21 
22 #define DL_COMPLETE_ATTR "Meta:DownloadCompleted"
23 
24 
25 /*static*/ bool
26 FetchUtils::IsDownloadCompleted(const char* path)
27 {
28 	BEntry entry(path, true);
29 	BNode node(&entry);
30 	return IsDownloadCompleted(node);
31 }
32 
33 
34 /*static*/ bool
35 FetchUtils::IsDownloadCompleted(const BNode& node)
36 {
37     bool isComplete;
38     status_t status = _GetAttribute(node, DL_COMPLETE_ATTR,
39         B_BOOL_TYPE, &isComplete, sizeof(isComplete));
40     if (status != B_OK) {
41         // Most likely cause is that the attribute was not written,
42         // for example by previous versions of the Package Kit.
43         // Worst outcome of assuming a partial download should be
44         // a no-op range request.
45         isComplete = false;
46     }
47     return isComplete;
48 }
49 
50 
51 /*static*/ status_t
52 FetchUtils::MarkDownloadComplete(BNode& node)
53 {
54     bool isComplete = true;
55     return _SetAttribute(node, DL_COMPLETE_ATTR,
56         B_BOOL_TYPE, &isComplete, sizeof(isComplete));
57 }
58 
59 
60 /*static*/ status_t
61 FetchUtils::SetFileType(BNode& node, const char* type)
62 {
63 	return _SetAttribute(node, "BEOS:TYPE",
64         B_MIME_STRING_TYPE, type, strlen(type) + 1);
65 }
66 
67 status_t
68 FetchUtils::_SetAttribute(BNode& node, const char* attrName,
69     type_code type, const void* data, size_t size)
70 {
71 	if (node.InitCheck() != B_OK)
72 		return node.InitCheck();
73 
74 	ssize_t written = node.WriteAttr(attrName, type, 0, data, size);
75 	if (written != (ssize_t)size) {
76 		if (written < 0)
77 			return (status_t)written;
78 		return B_IO_ERROR;
79 	}
80 	return B_OK;
81 }
82 
83 
84 status_t
85 FetchUtils::_GetAttribute(const BNode& node, const char* attrName,
86     type_code type, void* data, size_t size)
87 {
88 	if (node.InitCheck() != B_OK)
89 		return node.InitCheck();
90 
91 	ssize_t read = node.ReadAttr(attrName, type, 0, data, size);
92 	if (read != (ssize_t)size) {
93 		if (read < 0)
94 			return (status_t)read;
95 		return B_IO_ERROR;
96 	}
97 	return B_OK;
98 }
99 
100 
101 }	// namespace BPrivate
102 
103 }	// namespace BPackageKit
104