Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/cpp11_v2/src/libraries/network/FunctionCall.cc @ 10917

Last change on this file since 10917 was 10916, checked in by landauf, 10 years ago

use actual types instead of 'auto'. only exception is for complicated template types, e.g. when iterating over a map

  • Property svn:eol-style set to native
File size: 4.3 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss <scheusso [at] orxonox.net>, (C) 2010
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "FunctionCall.h"
30
31#include <cassert>
32#include "util/MultiType.h"
33#include "NetworkFunction.h"
34#include "NetworkFunctionManager.h"
35
36namespace orxonox {
37
38FunctionCall::FunctionCall()
39 : nrOfArguments_(-1), objectID_(OBJECTID_UNKNOWN), size_(0)
40{
41}
42
43FunctionCall::~FunctionCall()
44{
45}
46
47
48bool FunctionCall::execute(){
49  NetworkFunctionBase* fct = NetworkFunctionManager::getInstance().getFunctionByNetworkId( this->functionID_ );
50  assert( fct != nullptr );
51  assert( this->nrOfArguments_==this->arguments_.size() );
52  switch(this->nrOfArguments_)
53  {
54    case 0:
55      return fct->call(this->objectID_);
56    case 1:
57      return fct->call(this->objectID_, this->arguments_[0]);
58    case 2:
59      return fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]);
60    case 3:
61      return fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]);
62    case 4:
63      return fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]);
64    case 5:
65      return fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]);
66    default:
67      assert(0);
68      return true; // return true to avoid that this functions gets called over and over again
69  }
70}
71
72void FunctionCall::setCall( uint32_t networkID, uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5){
73
74  // first determine the size that has to be reserved for this call
75  uint32_t callsize = 3*sizeof(uint32_t); //size for network-function-id and nrOfArguments and the objectID
76  uint32_t nrOfArguments = 0;
77  if(!mt1.null())
78  {
79    nrOfArguments++;
80    callsize += mt1.getNetworkSize();
81    this->arguments_.push_back(mt1);
82    if(!mt2.null())
83    {
84      nrOfArguments++;
85      callsize += mt2.getNetworkSize();
86      this->arguments_.push_back(mt2);
87      if(!mt3.null())
88      {
89        nrOfArguments++;
90        callsize += mt3.getNetworkSize();
91        this->arguments_.push_back(mt3);
92        if(!mt4.null())
93        {
94          nrOfArguments++;
95          callsize += mt4.getNetworkSize();
96          this->arguments_.push_back(mt4);
97          if(!mt5.null())
98          {
99            nrOfArguments++;
100            callsize += mt5.getNetworkSize();
101            this->arguments_.push_back(mt5);
102          }
103        }
104      }
105    }
106  }
107  this->nrOfArguments_ = nrOfArguments;
108  this->functionID_ = networkID;
109  this->objectID_ = objectID;
110  this->size_ = callsize;
111}
112
113void FunctionCall::loadData(uint8_t*& mem)
114{
115  this->functionID_ = *(uint32_t*)mem;
116  this->nrOfArguments_ = *(uint32_t*)(mem+sizeof(uint32_t));
117  this->objectID_ = *(uint32_t*)(mem+2*sizeof(uint32_t));
118  mem += 3*sizeof(uint32_t);
119  for( unsigned int i=0; i<this->nrOfArguments_; ++i )
120  {
121    this->arguments_.push_back(MultiType());
122    this->arguments_.back().importData(mem);
123  }
124}
125
126void FunctionCall::saveData(uint8_t*& mem)
127{
128  // now serialise the mt values and copy the function id and isStatic
129  *(uint32_t*)mem = this->functionID_;
130  *(uint32_t*)(mem+sizeof(uint32_t)) = this->nrOfArguments_;
131  *(uint32_t*)(mem+2*sizeof(uint32_t)) = this->objectID_;
132  mem += 3*sizeof(uint32_t);
133  for(const MultiType& argument : this->arguments_)
134  {
135    argument.exportData( mem );
136  }
137}
138
139
140
141} //namespace orxonox
Note: See TracBrowser for help on using the repository browser.