/* $Id$
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version
 * 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "support/EtchStackServer.h"

const EtchObjectType* EtchStackServer::TYPE() {
   const static EtchObjectType TYPE(EOTID_STACK_SERVER, NULL);
   return &TYPE;
}

EtchStackServer::EtchStackServer()
: EtchStack(), mRemote(NULL) {
  addObjectType(EtchStackServer::TYPE());
}

EtchStackServer::EtchStackServer(const EtchStackServer& other)
: EtchStack(other), mRemote(other.mRemote) {
}

EtchStackServer::~EtchStackServer() {
  if (mRemote != NULL) {
    delete mRemote;
  }
}

void EtchStackServer::setRemote(EtchRemoteBase* remote) {
  mRemote = remote;
}

EtchRemoteBase* EtchStackServer::getRemote() {
  return mRemote;
}
