<?php
namespace Airavata\Model\Data\Transfer;

/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;


final class StorageResourceProtocol {
  const SCP = 0;
  const SFTP = 1;
  const HTTP = 2;
  const HTTPS = 3;
  const GridFTP = 4;
  const LOCAL = 5;
  static public $__names = array(
    0 => 'SCP',
    1 => 'SFTP',
    2 => 'HTTP',
    3 => 'HTTPS',
    4 => 'GridFTP',
    5 => 'LOCAL',
  );
}

final class LSEntryType {
  const DIRECTORY = 0;
  const FILE = 1;
  static public $__names = array(
    0 => 'DIRECTORY',
    1 => 'FILE',
  );
}

final class FileTransferMode {
  const SYNC = 0;
  const ASYNC = 1;
  static public $__names = array(
    0 => 'SYNC',
    1 => 'ASYNC',
  );
}

final class FileTransferStatus {
  const CREATED = 0;
  const QUEUED = 1;
  const RUNNING = 2;
  const COMPLETED = 3;
  const FAILED = 4;
  static public $__names = array(
    0 => 'CREATED',
    1 => 'QUEUED',
    2 => 'RUNNING',
    3 => 'COMPLETED',
    4 => 'FAILED',
  );
}

class FileTransferRequestModel {
  static $_TSPEC;

  /**
   * @var string
   */
  public $transferId = null;
  /**
   * @var string
   */
  public $gatewayId = null;
  /**
   * @var string
   */
  public $username = null;
  /**
   * @var string
   */
  public $srcHostname = null;
  /**
   * @var string
   */
  public $srcLoginName = null;
  /**
   * @var int
   */
  public $srcPort = null;
  /**
   * @var int
   */
  public $srcProtocol = null;
  /**
   * @var string
   */
  public $srcFilePath = null;
  /**
   * @var string
   */
  public $srcHostCredToken = null;
  /**
   * @var string
   */
  public $destHostname = null;
  /**
   * @var string
   */
  public $destLoginName = null;
  /**
   * @var int
   */
  public $destPort = null;
  /**
   * @var int
   */
  public $destProtocol = null;
  /**
   * @var string
   */
  public $destFilePath = null;
  /**
   * @var string
   */
  public $destHostCredToken = null;
  /**
   * @var int
   */
  public $fileTransferMode = null;
  /**
   * @var int
   */
  public $transferStatus = null;
  /**
   * @var int
   */
  public $fileSize = null;
  /**
   * @var int
   */
  public $transferTime = null;
  /**
   * @var int
   */
  public $createdTime = null;
  /**
   * @var int
   */
  public $lastModifiedType = null;
  /**
   * @var string[]
   */
  public $callbackEmails = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'transferId',
          'type' => TType::STRING,
          ),
        2 => array(
          'var' => 'gatewayId',
          'type' => TType::STRING,
          ),
        3 => array(
          'var' => 'username',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'srcHostname',
          'type' => TType::STRING,
          ),
        5 => array(
          'var' => 'srcLoginName',
          'type' => TType::STRING,
          ),
        6 => array(
          'var' => 'srcPort',
          'type' => TType::I64,
          ),
        7 => array(
          'var' => 'srcProtocol',
          'type' => TType::I32,
          ),
        8 => array(
          'var' => 'srcFilePath',
          'type' => TType::STRING,
          ),
        9 => array(
          'var' => 'srcHostCredToken',
          'type' => TType::STRING,
          ),
        10 => array(
          'var' => 'destHostname',
          'type' => TType::STRING,
          ),
        11 => array(
          'var' => 'destLoginName',
          'type' => TType::STRING,
          ),
        12 => array(
          'var' => 'destPort',
          'type' => TType::I64,
          ),
        13 => array(
          'var' => 'destProtocol',
          'type' => TType::I32,
          ),
        14 => array(
          'var' => 'destFilePath',
          'type' => TType::STRING,
          ),
        15 => array(
          'var' => 'destHostCredToken',
          'type' => TType::STRING,
          ),
        16 => array(
          'var' => 'fileTransferMode',
          'type' => TType::I32,
          ),
        17 => array(
          'var' => 'transferStatus',
          'type' => TType::I32,
          ),
        18 => array(
          'var' => 'fileSize',
          'type' => TType::I64,
          ),
        19 => array(
          'var' => 'transferTime',
          'type' => TType::I64,
          ),
        20 => array(
          'var' => 'createdTime',
          'type' => TType::I64,
          ),
        21 => array(
          'var' => 'lastModifiedType',
          'type' => TType::I64,
          ),
        22 => array(
          'var' => 'callbackEmails',
          'type' => TType::LST,
          'etype' => TType::STRING,
          'elem' => array(
            'type' => TType::STRING,
            ),
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['transferId'])) {
        $this->transferId = $vals['transferId'];
      }
      if (isset($vals['gatewayId'])) {
        $this->gatewayId = $vals['gatewayId'];
      }
      if (isset($vals['username'])) {
        $this->username = $vals['username'];
      }
      if (isset($vals['srcHostname'])) {
        $this->srcHostname = $vals['srcHostname'];
      }
      if (isset($vals['srcLoginName'])) {
        $this->srcLoginName = $vals['srcLoginName'];
      }
      if (isset($vals['srcPort'])) {
        $this->srcPort = $vals['srcPort'];
      }
      if (isset($vals['srcProtocol'])) {
        $this->srcProtocol = $vals['srcProtocol'];
      }
      if (isset($vals['srcFilePath'])) {
        $this->srcFilePath = $vals['srcFilePath'];
      }
      if (isset($vals['srcHostCredToken'])) {
        $this->srcHostCredToken = $vals['srcHostCredToken'];
      }
      if (isset($vals['destHostname'])) {
        $this->destHostname = $vals['destHostname'];
      }
      if (isset($vals['destLoginName'])) {
        $this->destLoginName = $vals['destLoginName'];
      }
      if (isset($vals['destPort'])) {
        $this->destPort = $vals['destPort'];
      }
      if (isset($vals['destProtocol'])) {
        $this->destProtocol = $vals['destProtocol'];
      }
      if (isset($vals['destFilePath'])) {
        $this->destFilePath = $vals['destFilePath'];
      }
      if (isset($vals['destHostCredToken'])) {
        $this->destHostCredToken = $vals['destHostCredToken'];
      }
      if (isset($vals['fileTransferMode'])) {
        $this->fileTransferMode = $vals['fileTransferMode'];
      }
      if (isset($vals['transferStatus'])) {
        $this->transferStatus = $vals['transferStatus'];
      }
      if (isset($vals['fileSize'])) {
        $this->fileSize = $vals['fileSize'];
      }
      if (isset($vals['transferTime'])) {
        $this->transferTime = $vals['transferTime'];
      }
      if (isset($vals['createdTime'])) {
        $this->createdTime = $vals['createdTime'];
      }
      if (isset($vals['lastModifiedType'])) {
        $this->lastModifiedType = $vals['lastModifiedType'];
      }
      if (isset($vals['callbackEmails'])) {
        $this->callbackEmails = $vals['callbackEmails'];
      }
    }
  }

  public function getName() {
    return 'FileTransferRequestModel';
  }

  public function read($input)
  {
    $xfer = 0;
    $fname = null;
    $ftype = 0;
    $fid = 0;
    $xfer += $input->readStructBegin($fname);
    while (true)
    {
      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
      if ($ftype == TType::STOP) {
        break;
      }
      switch ($fid)
      {
        case 1:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->transferId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->gatewayId);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->username);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->srcHostname);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->srcLoginName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->srcPort);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 7:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->srcProtocol);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 8:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->srcFilePath);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 9:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->srcHostCredToken);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 10:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->destHostname);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 11:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->destLoginName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 12:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->destPort);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 13:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->destProtocol);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 14:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->destFilePath);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 15:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->destHostCredToken);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 16:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->fileTransferMode);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 17:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->transferStatus);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 18:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->fileSize);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 19:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->transferTime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 20:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->createdTime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 21:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->lastModifiedType);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 22:
          if ($ftype == TType::LST) {
            $this->callbackEmails = array();
            $_size0 = 0;
            $_etype3 = 0;
            $xfer += $input->readListBegin($_etype3, $_size0);
            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
            {
              $elem5 = null;
              $xfer += $input->readString($elem5);
              $this->callbackEmails []= $elem5;
            }
            $xfer += $input->readListEnd();
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        default:
          $xfer += $input->skip($ftype);
          break;
      }
      $xfer += $input->readFieldEnd();
    }
    $xfer += $input->readStructEnd();
    return $xfer;
  }

  public function write($output) {
    $xfer = 0;
    $xfer += $output->writeStructBegin('FileTransferRequestModel');
    if ($this->transferId !== null) {
      $xfer += $output->writeFieldBegin('transferId', TType::STRING, 1);
      $xfer += $output->writeString($this->transferId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->gatewayId !== null) {
      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
      $xfer += $output->writeString($this->gatewayId);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->username !== null) {
      $xfer += $output->writeFieldBegin('username', TType::STRING, 3);
      $xfer += $output->writeString($this->username);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcHostname !== null) {
      $xfer += $output->writeFieldBegin('srcHostname', TType::STRING, 4);
      $xfer += $output->writeString($this->srcHostname);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcLoginName !== null) {
      $xfer += $output->writeFieldBegin('srcLoginName', TType::STRING, 5);
      $xfer += $output->writeString($this->srcLoginName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcPort !== null) {
      $xfer += $output->writeFieldBegin('srcPort', TType::I64, 6);
      $xfer += $output->writeI64($this->srcPort);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcProtocol !== null) {
      $xfer += $output->writeFieldBegin('srcProtocol', TType::I32, 7);
      $xfer += $output->writeI32($this->srcProtocol);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcFilePath !== null) {
      $xfer += $output->writeFieldBegin('srcFilePath', TType::STRING, 8);
      $xfer += $output->writeString($this->srcFilePath);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->srcHostCredToken !== null) {
      $xfer += $output->writeFieldBegin('srcHostCredToken', TType::STRING, 9);
      $xfer += $output->writeString($this->srcHostCredToken);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destHostname !== null) {
      $xfer += $output->writeFieldBegin('destHostname', TType::STRING, 10);
      $xfer += $output->writeString($this->destHostname);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destLoginName !== null) {
      $xfer += $output->writeFieldBegin('destLoginName', TType::STRING, 11);
      $xfer += $output->writeString($this->destLoginName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destPort !== null) {
      $xfer += $output->writeFieldBegin('destPort', TType::I64, 12);
      $xfer += $output->writeI64($this->destPort);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destProtocol !== null) {
      $xfer += $output->writeFieldBegin('destProtocol', TType::I32, 13);
      $xfer += $output->writeI32($this->destProtocol);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destFilePath !== null) {
      $xfer += $output->writeFieldBegin('destFilePath', TType::STRING, 14);
      $xfer += $output->writeString($this->destFilePath);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->destHostCredToken !== null) {
      $xfer += $output->writeFieldBegin('destHostCredToken', TType::STRING, 15);
      $xfer += $output->writeString($this->destHostCredToken);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->fileTransferMode !== null) {
      $xfer += $output->writeFieldBegin('fileTransferMode', TType::I32, 16);
      $xfer += $output->writeI32($this->fileTransferMode);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->transferStatus !== null) {
      $xfer += $output->writeFieldBegin('transferStatus', TType::I32, 17);
      $xfer += $output->writeI32($this->transferStatus);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->fileSize !== null) {
      $xfer += $output->writeFieldBegin('fileSize', TType::I64, 18);
      $xfer += $output->writeI64($this->fileSize);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->transferTime !== null) {
      $xfer += $output->writeFieldBegin('transferTime', TType::I64, 19);
      $xfer += $output->writeI64($this->transferTime);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->createdTime !== null) {
      $xfer += $output->writeFieldBegin('createdTime', TType::I64, 20);
      $xfer += $output->writeI64($this->createdTime);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->lastModifiedType !== null) {
      $xfer += $output->writeFieldBegin('lastModifiedType', TType::I64, 21);
      $xfer += $output->writeI64($this->lastModifiedType);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->callbackEmails !== null) {
      if (!is_array($this->callbackEmails)) {
        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
      }
      $xfer += $output->writeFieldBegin('callbackEmails', TType::LST, 22);
      {
        $output->writeListBegin(TType::STRING, count($this->callbackEmails));
        {
          foreach ($this->callbackEmails as $iter6)
          {
            $xfer += $output->writeString($iter6);
          }
        }
        $output->writeListEnd();
      }
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}

class LSEntryModel {
  static $_TSPEC;

  /**
   * @var int
   */
  public $type = null;
  /**
   * @var int
   */
  public $size = null;
  /**
   * @var string
   */
  public $nativeType = null;
  /**
   * @var string
   */
  public $name = null;
  /**
   * @var string
   */
  public $path = null;
  /**
   * @var string
   */
  public $storageHostName = null;
  /**
   * @var int
   */
  public $lastModifiedType = null;
  /**
   * @var int
   */
  public $createdTime = null;

  public function __construct($vals=null) {
    if (!isset(self::$_TSPEC)) {
      self::$_TSPEC = array(
        1 => array(
          'var' => 'type',
          'type' => TType::I32,
          ),
        2 => array(
          'var' => 'size',
          'type' => TType::I64,
          ),
        3 => array(
          'var' => 'nativeType',
          'type' => TType::STRING,
          ),
        4 => array(
          'var' => 'name',
          'type' => TType::STRING,
          ),
        5 => array(
          'var' => 'path',
          'type' => TType::STRING,
          ),
        6 => array(
          'var' => 'storageHostName',
          'type' => TType::STRING,
          ),
        7 => array(
          'var' => 'lastModifiedType',
          'type' => TType::I64,
          ),
        8 => array(
          'var' => 'createdTime',
          'type' => TType::I64,
          ),
        );
    }
    if (is_array($vals)) {
      if (isset($vals['type'])) {
        $this->type = $vals['type'];
      }
      if (isset($vals['size'])) {
        $this->size = $vals['size'];
      }
      if (isset($vals['nativeType'])) {
        $this->nativeType = $vals['nativeType'];
      }
      if (isset($vals['name'])) {
        $this->name = $vals['name'];
      }
      if (isset($vals['path'])) {
        $this->path = $vals['path'];
      }
      if (isset($vals['storageHostName'])) {
        $this->storageHostName = $vals['storageHostName'];
      }
      if (isset($vals['lastModifiedType'])) {
        $this->lastModifiedType = $vals['lastModifiedType'];
      }
      if (isset($vals['createdTime'])) {
        $this->createdTime = $vals['createdTime'];
      }
    }
  }

  public function getName() {
    return 'LSEntryModel';
  }

  public function read($input)
  {
    $xfer = 0;
    $fname = null;
    $ftype = 0;
    $fid = 0;
    $xfer += $input->readStructBegin($fname);
    while (true)
    {
      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
      if ($ftype == TType::STOP) {
        break;
      }
      switch ($fid)
      {
        case 1:
          if ($ftype == TType::I32) {
            $xfer += $input->readI32($this->type);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 2:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->size);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 3:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->nativeType);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 4:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->name);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 5:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->path);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 6:
          if ($ftype == TType::STRING) {
            $xfer += $input->readString($this->storageHostName);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 7:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->lastModifiedType);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        case 8:
          if ($ftype == TType::I64) {
            $xfer += $input->readI64($this->createdTime);
          } else {
            $xfer += $input->skip($ftype);
          }
          break;
        default:
          $xfer += $input->skip($ftype);
          break;
      }
      $xfer += $input->readFieldEnd();
    }
    $xfer += $input->readStructEnd();
    return $xfer;
  }

  public function write($output) {
    $xfer = 0;
    $xfer += $output->writeStructBegin('LSEntryModel');
    if ($this->type !== null) {
      $xfer += $output->writeFieldBegin('type', TType::I32, 1);
      $xfer += $output->writeI32($this->type);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->size !== null) {
      $xfer += $output->writeFieldBegin('size', TType::I64, 2);
      $xfer += $output->writeI64($this->size);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->nativeType !== null) {
      $xfer += $output->writeFieldBegin('nativeType', TType::STRING, 3);
      $xfer += $output->writeString($this->nativeType);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->name !== null) {
      $xfer += $output->writeFieldBegin('name', TType::STRING, 4);
      $xfer += $output->writeString($this->name);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->path !== null) {
      $xfer += $output->writeFieldBegin('path', TType::STRING, 5);
      $xfer += $output->writeString($this->path);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->storageHostName !== null) {
      $xfer += $output->writeFieldBegin('storageHostName', TType::STRING, 6);
      $xfer += $output->writeString($this->storageHostName);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->lastModifiedType !== null) {
      $xfer += $output->writeFieldBegin('lastModifiedType', TType::I64, 7);
      $xfer += $output->writeI64($this->lastModifiedType);
      $xfer += $output->writeFieldEnd();
    }
    if ($this->createdTime !== null) {
      $xfer += $output->writeFieldBegin('createdTime', TType::I64, 8);
      $xfer += $output->writeI64($this->createdTime);
      $xfer += $output->writeFieldEnd();
    }
    $xfer += $output->writeFieldStop();
    $xfer += $output->writeStructEnd();
    return $xfer;
  }

}


