/*
 * Copyright 2009 Google Inc.
 *
 * 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 com.google.gwt.missingplugin.client;

import com.google.gwt.core.client.JavaScriptObject;

/**
 * Overlay type representing one recognized potential download target.
 */
public final class DownloadEntry extends JavaScriptObject {

  protected DownloadEntry() { }

  public native String getHref()/*-{
    return this.url;
  }-*/;

  public native String getLinkContentHtml()/*-{
    return this.caption;
  }-*/;

  public native String getPlatforms()/*-{
    return this.platforms;
  }-*/;

  public native boolean isSupported() /*-{
    return this.supported;
  }-*/;

}
