/// <summary>
        /// <para>Initializes a new instance of the <see cref="FileLinkMetadata" />
        /// class.</para>
        /// </summary>
        /// <param name="url">URL of the shared link.</param>
        /// <param name="name">The linked file name (including extension). This never contains
        /// a slash.</param>
        /// <param name="linkPermissions">The link's access permissions.</param>
        /// <param name="clientModified">The modification time set by the desktop client when
        /// the file was added to Dropbox. Since this time is not verified (the Dropbox server
        /// stores whatever the desktop client sends up), this should only be used for display
        /// purposes (such as sorting) and not, for example, to determine if a file has changed
        /// or not.</param>
        /// <param name="serverModified">The last time the file was modified on
        /// Dropbox.</param>
        /// <param name="rev">A unique identifier for the current revision of a file. This
        /// field is the same rev as elsewhere in the API and can be used to detect changes and
        /// avoid conflicts.</param>
        /// <param name="size">The file size in bytes.</param>
        /// <param name="id">A unique identifier for the linked file.</param>
        /// <param name="expires">Expiration time, if set. By default the link won't
        /// expire.</param>
        /// <param name="pathLower">The lowercased full path in the user's Dropbox. This always
        /// starts with a slash. This field will only be present only if the linked file is in
        /// the authenticated user's  dropbox.</param>
        /// <param name="teamMemberInfo">The team membership information of the link's owner.
        /// This field will only be present  if the link's owner is a team member.</param>
        /// <param name="contentOwnerTeamInfo">The team information of the content's owner.
        /// This field will only be present if the content's owner is a team member and the
        /// content's owner team is different from the link's owner team.</param>
        public FileLinkMetadata(string url,
                                string name,
                                LinkPermissions linkPermissions,
                                sys.DateTime clientModified,
                                sys.DateTime serverModified,
                                string rev,
                                ulong size,
                                string id                     = null,
                                sys.DateTime?expires          = null,
                                string pathLower              = null,
                                TeamMemberInfo teamMemberInfo = null,
                                Dropbox.Api.Users.Team contentOwnerTeamInfo = null)
            : base(url, name, linkPermissions, id, expires, pathLower, teamMemberInfo, contentOwnerTeamInfo)
        {
            if (rev == null)
            {
                throw new sys.ArgumentNullException("rev");
            }
            if (rev.Length < 9)
            {
                throw new sys.ArgumentOutOfRangeException("rev", "Length should be at least 9");
            }
            if (!re.Regex.IsMatch(rev, @"\A(?:[0-9a-f]+)\z"))
            {
                throw new sys.ArgumentOutOfRangeException("rev", @"Value should match pattern '\A(?:[0-9a-f]+)\z'");
            }

            this.ClientModified = clientModified;
            this.ServerModified = serverModified;
            this.Rev            = rev;
            this.Size           = size;
        }
 /// <summary>
 /// <para>Initializes a new instance of the <see cref="FolderLinkMetadata" />
 /// class.</para>
 /// </summary>
 /// <param name="url">URL of the shared link.</param>
 /// <param name="name">The linked file name (including extension). This never contains
 /// a slash.</param>
 /// <param name="linkPermissions">The link's access permissions.</param>
 /// <param name="id">A unique identifier for the linked file.</param>
 /// <param name="expires">Expiration time, if set. By default the link won't
 /// expire.</param>
 /// <param name="pathLower">The lowercased full path in the user's Dropbox. This always
 /// starts with a slash. This field will only be present only if the linked file is in
 /// the authenticated user's  dropbox.</param>
 /// <param name="teamMemberInfo">The team membership information of the link's owner.
 /// This field will only be present  if the link's owner is a team member.</param>
 /// <param name="contentOwnerTeamInfo">The team information of the content's owner.
 /// This field will only be present if the content's owner is a team member and the
 /// content's owner team is different from the link's owner team.</param>
 public FolderLinkMetadata(string url,
                           string name,
                           LinkPermissions linkPermissions,
                           string id                     = null,
                           sys.DateTime?expires          = null,
                           string pathLower              = null,
                           TeamMemberInfo teamMemberInfo = null,
                           Dropbox.Api.Users.Team contentOwnerTeamInfo = null)
     : base(url, name, linkPermissions, id, expires, pathLower, teamMemberInfo, contentOwnerTeamInfo)
 {
 }
        /// <summary>
        /// <para>Initializes a new instance of the <see cref="SharedLinkMetadata" />
        /// class.</para>
        /// </summary>
        /// <param name="url">URL of the shared link.</param>
        /// <param name="name">The linked file name (including extension). This never contains
        /// a slash.</param>
        /// <param name="linkPermissions">The link's access permissions.</param>
        /// <param name="id">A unique identifier for the linked file.</param>
        /// <param name="expires">Expiration time, if set. By default the link won't
        /// expire.</param>
        /// <param name="pathLower">The lowercased full path in the user's Dropbox. This always
        /// starts with a slash. This field will only be present only if the linked file is in
        /// the authenticated user's  dropbox.</param>
        /// <param name="teamMemberInfo">The team membership information of the link's owner.
        /// This field will only be present  if the link's owner is a team member.</param>
        /// <param name="contentOwnerTeamInfo">The team information of the content's owner.
        /// This field will only be present if the content's owner is a team member and the
        /// content's owner team is different from the link's owner team.</param>
        protected SharedLinkMetadata(string url,
                                     string name,
                                     LinkPermissions linkPermissions,
                                     string id                     = null,
                                     sys.DateTime?expires          = null,
                                     string pathLower              = null,
                                     TeamMemberInfo teamMemberInfo = null,
                                     Dropbox.Api.Users.Team contentOwnerTeamInfo = null)
        {
            if (url == null)
            {
                throw new sys.ArgumentNullException("url");
            }

            if (name == null)
            {
                throw new sys.ArgumentNullException("name");
            }

            if (linkPermissions == null)
            {
                throw new sys.ArgumentNullException("linkPermissions");
            }

            if (id != null)
            {
                if (id.Length < 1)
                {
                    throw new sys.ArgumentOutOfRangeException("id", "Length should be at least 1");
                }
            }

            this.Url             = url;
            this.Name            = name;
            this.LinkPermissions = linkPermissions;
            this.Id                   = id;
            this.Expires              = expires;
            this.PathLower            = pathLower;
            this.TeamMemberInfo       = teamMemberInfo;
            this.ContentOwnerTeamInfo = contentOwnerTeamInfo;
        }