/*
 * Licensed 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.
 */
package org.jutils.jhardware.model;

import java.util.Map;

/** @author Javier Garcia Alonso */
public class MemoryInfo implements ComponentInfo {
  private String totalMemory;
  private String freeMemory;
  private String availableMemory;

  private Map<String, String> fullInfo;

  public String getTotalMemory() {
    return totalMemory;
  }

  public void setTotalMemory(String totalMemory) {
    this.totalMemory = totalMemory;
  }

  public String getFreeMemory() {
    return freeMemory;
  }

  public void setFreeMemory(String freeMemory) {
    this.freeMemory = freeMemory;
  }

  public String getAvailableMemory() {
    return availableMemory;
  }

  public void setAvailableMemory(String availableMemory) {
    this.availableMemory = availableMemory;
  }

  public Map<String, String> getFullInfo() {
    return fullInfo;
  }

  public void setFullInfo(Map<String, String> fullInfo) {
    this.fullInfo = fullInfo;
  }
}
