/* $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/EtchStackClient.h"
#include "support/EtchTransportHelper.h"

const EtchObjectType* EtchStackClient::TYPE() {
   const static EtchObjectType TYPE(EOTID_STACK_CLIENT, NULL);
   return &TYPE;
}

EtchStackClient::EtchStackClient(EtchRuntime* runtime) : EtchStack(), mRuntime(runtime), mStaticResources(NULL) {
  addObjectType(EtchStackClient::TYPE());
}

EtchStackClient::EtchStackClient(const EtchStackClient& other)
 : EtchStack(other), mRuntime(other.mRuntime), mStaticResources(other.mStaticResources)
{

}

EtchStackClient::~EtchStackClient() {
  if (mStaticResources != NULL) {
    EtchTransportHelper::DestroyResources(mRuntime, mStaticResources);
  }
}

