hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
FileWriter.cpp
Go to the documentation of this file.
1 #include <FileWriter.h>
2 FileWriter::FileWriter(ssize_t bufSize)
3 {
4  lastErrNo = 0;
5  int retry = 3;
6  do{
7  buffer = (char*)malloc(bufSize);
8  if(!buffer)bufSize >>= 1;
9  }while(--retry > 0 && buffer == NULL);
10  if(!buffer)lastErrNo = errno;
11  size = bufSize;
12  file = 0;
13  isOpen = false;
14  pos = 0;
15 }
16 
18 {
19  this->close();
20  free(buffer);
21 }
22 
23 bool FileWriter::open(const char *name, mode_t mode)
24 {
25  file = ::open(name, O_WRONLY|O_CREAT|O_TRUNC, mode);
26  if(file < 0)
27  {
28  lastErrNo = errno;
29  return false;
30  }
31  isOpen = true;
32  return true;
33 }
34 
36 {
37  if(!buffer)return false;
38  if(pos > 0)
39  {
40  if(::write(file, buffer, pos) != pos)
41  {
42  lastErrNo = errno;
43  pos = 0;
44  return false;
45  }
46  pos = 0;
47  }
48  return true;
49 }
50 
51 bool FileWriter::write(const void *src, ssize_t wsize)
52 {
53  char *buf = (char*)src;
54  ssize_t delta = 0;
55  if(!buffer)return false;
56  while(wsize)
57  {
58  delta = (size - pos) > wsize ? wsize : (size - pos);
59  memcpy(buffer + pos, buf, delta);
60  buf += delta;
61  pos += delta;
62  wsize -= delta;
63  if(size == pos)
64  {
65  if(::write(file, buffer, size) != size)
66  {
67  lastErrNo = errno;
68  return false;
69  }
70  pos = 0;
71  }
72  }
73  return true;
74 }
75 
77 {
78  if(isOpen)
79  {
80  this->flush();
81  ::close(file);
82  isOpen = false;
83  }
84 }
85