X-Plane Remote Access Plugin and Client Library
GetDataRefTask.cc
1 // Copyright (c) 2013 by István Váradi
2 
3 // This file is part of XPLRA, a remote-access plugin for X-Plane
4 
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 
8 // 1. Redistributions of source code must retain the above copyright notice, this
9 // list of conditions and the following disclaimer.
10 // 2. Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 
14 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18 // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 
25 // The views and conclusions contained in the software and documentation are those
26 // of the authors and should not be interpreted as representing official policies,
27 // either expressed or implied, of the FreeBSD Project.
28 
29 //------------------------------------------------------------------------------
30 
31 #include "GetDataRefTask.h"
32 #include "Protocol.h"
33 
34 #include "hu/varadiistvan/xplcommon/Util.h"
35 
36 //------------------------------------------------------------------------------
37 
42 
43 using hu::varadiistvan::scpl::io::DataStream;
44 using hu::varadiistvan::xplcommon::Util;
45 
46 using std::string;
47 
48 //------------------------------------------------------------------------------
49 
50 GetDataRefTask* GetDataRefTask::create(uint8_t& result, DataStream& stream)
51 {
52  result = Protocol::RESULT_OK;
53 
54  string name = stream.readString();
55  uint8_t type = stream.readU8();
56  if (!stream) return 0;
57 
58  // Util::debug("hu.varadiistvan.xplra.GetDataRefTask::execute: name='%s', type=0x%02x\n",
59  // name.c_str(), type);
60 
61  if (type==Protocol::TYPE_INT) {
62  return new GetIntDataRefTask(name);
63  } else if (type==Protocol::TYPE_FLOAT) {
64  return new GetFloatDataRefTask(name);
65  } else if (type==Protocol::TYPE_DOUBLE) {
66  return new GetDoubleDataRefTask(name);
67  } else if (type==Protocol::TYPE_FLOAT_ARRAY ||
70  {
71  int length = stream.readS32();
72  int offset = stream.readS32();
73  if (!stream) return 0;
74 
75  if (length>Protocol::MAX_LENGTH) {
77  return 0;
78  }
79  if (offset<0) {
81  return 0;
82  }
83 
84  if (type==Protocol::TYPE_FLOAT_ARRAY) {
85  return new GetFloatArrayDataRefTask(name, length, offset);
86  } else if (type==Protocol::TYPE_INT_ARRAY) {
87  return new GetIntArrayDataRefTask(name, length, offset);
88  } else {
89  return new GetByteArrayDataRefTask(name, length, offset);
90  }
91  } else {
93  return 0;
94  }
95 }
96 
97 //------------------------------------------------------------------------------
98 //------------------------------------------------------------------------------
99 
100 void GetIntDataRefTask::writeValue(DataStream& stream)
101 {
102  stream.writeS32(getValue());
103 }
104 
105 //------------------------------------------------------------------------------
106 
107 void GetFloatDataRefTask::writeValue(DataStream& stream)
108 {
109  stream.writeFloat(getValue());
110 }
111 
112 //------------------------------------------------------------------------------
113 
114 void GetDoubleDataRefTask::writeValue(DataStream& stream)
115 {
116  stream.writeDouble(getValue());
117 }
118 
119 //------------------------------------------------------------------------------
120 
121 // Local Variables:
122 // mode: C++
123 // c-basic-offset: 4
124 // indent-tabs-mode: nil
125 // End:
std::string name
Definition: DataRefTask.h:56
virtual void writeValue(hu::varadiistvan::scpl::io::DataStream &stream)
virtual void writeValue(hu::varadiistvan::scpl::io::DataStream &stream)
virtual void writeValue(hu::varadiistvan::scpl::io::DataStream &stream)
static const uint8_t RESULT_INVALID_LENGTH
Definition: Protocol.h:215
static const uint8_t TYPE_FLOAT_ARRAY
Definition: Protocol.h:180
static const uint8_t RESULT_OK
Definition: Protocol.h:195
static const uint8_t TYPE_INT
Definition: Protocol.h:165
static const uint8_t RESULT_INVALID_OFFSET
Definition: Protocol.h:220
static const uint8_t TYPE_DOUBLE
Definition: Protocol.h:175
static const uint8_t RESULT_INVALID_TYPE
Definition: Protocol.h:210
static const uint8_t TYPE_FLOAT
Definition: Protocol.h:170
static const uint8_t TYPE_INT_ARRAY
Definition: Protocol.h:185
static const uint8_t TYPE_BYTE_ARRAY
Definition: Protocol.h:190
static const int MAX_LENGTH
Definition: Protocol.h:255