blob: 4c0ca68f7309ec2e07ee97535ffaac0008648e04 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/*
* Copyright (C) 2005-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#include "File.h"
namespace XBMCAddon
{
namespace xbmcvfs
{
XbmcCommons::Buffer File::readBytes(unsigned long numBytes)
{
DelayedCallGuard dg(languageHook);
int64_t size = file->GetLength();
if ((!numBytes || (((int64_t)numBytes) > size)) && (size >= 0))
numBytes = (unsigned long) size;
XbmcCommons::Buffer ret(numBytes);
if (numBytes == 0)
return ret;
while(ret.remaining() > 0)
{
ssize_t bytesRead = file->Read(ret.curPosition(), ret.remaining());
if (bytesRead <= 0) // we consider this a failure or a EOF, can't tell which,
{ // return whatever we have already.
ret.flip();
return ret;
}
ret.forward(bytesRead);
}
ret.flip();
return ret;
}
bool File::write(XbmcCommons::Buffer& buffer)
{
DelayedCallGuard dg(languageHook);
while (buffer.remaining() > 0)
{
ssize_t bytesWritten = file->Write( buffer.curPosition(), buffer.remaining());
if (bytesWritten == 0) // this could be a failure (see HDFile, and XFileUtils) or
// it could mean something else when a negative number means an error
// (see CCurlFile). There is no consistency so we can only assume we're
// done when we get a 0.
return false;
else if (bytesWritten < 0) // But, if we get something less than zero, we KNOW it's an error.
return false;
buffer.forward(bytesWritten);// Otherwise, we advance the buffer by the amount written.
}
return true;
}
}
}
|