git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Pdf / PdfStringObject.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
5 //\r
6 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
7 //\r
8 // http://www.pdfsharp.com\r
9 // http://sourceforge.net/projects/pdfsharp\r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining a\r
12 // copy of this software and associated documentation files (the "Software"),\r
13 // to deal in the Software without restriction, including without limitation\r
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
15 // and/or sell copies of the Software, and to permit persons to whom the\r
16 // Software is furnished to do so, subject to the following conditions:\r
17 //\r
18 // The above copyright notice and this permission notice shall be included\r
19 // in all copies or substantial portions of the Software.\r
20 //\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
27 // DEALINGS IN THE SOFTWARE.\r
28 #endregion\r
29 \r
30 using System;\r
31 using System.Diagnostics;\r
32 using System.Collections;\r
33 using System.Text;\r
34 using System.IO;\r
35 using PdfSharp.Internal;\r
36 using PdfSharp.Pdf.IO;\r
37 using PdfSharp.Pdf.Internal;\r
38 \r
39 namespace PdfSharp.Pdf\r
40 {\r
41   /// <summary>\r
42   /// Represents an indirect text string value. This type is not used by PDFsharp. If it is imported from\r
43   /// an external PDF file, the value is converted into a direct object.\r
44   /// </summary>\r
45   [DebuggerDisplay("({Value})")]\r
46   public sealed class PdfStringObject : PdfObject\r
47   {\r
48     /// <summary>\r
49     /// Initializes a new instance of the <see cref="PdfStringObject"/> class.\r
50     /// </summary>\r
51     public PdfStringObject()\r
52     {\r
53       this.flags = PdfStringFlags.RawEncoding;\r
54     }\r
55 \r
56     /// <summary>\r
57     /// Initializes a new instance of the <see cref="PdfStringObject"/> class.\r
58     /// </summary>\r
59     /// <param name="document">The document.</param>\r
60     /// <param name="value">The value.</param>\r
61     public PdfStringObject(PdfDocument document, string value)\r
62       : base(document)\r
63     {\r
64       this.value = value;\r
65       this.flags = PdfStringFlags.RawEncoding;\r
66     }\r
67 \r
68     /// <summary>\r
69     /// Initializes a new instance of the <see cref="PdfStringObject"/> class.\r
70     /// </summary>\r
71     /// <param name="value">The value.</param>\r
72     /// <param name="encoding">The encoding.</param>\r
73     public PdfStringObject(string value, PdfStringEncoding encoding)\r
74     {\r
75       this.value = value;\r
76       //if ((flags & PdfStringFlags.EncodingMask) == 0)\r
77       //  flags |= PdfStringFlags.PDFDocEncoding;\r
78       this.flags = (PdfStringFlags)encoding;\r
79     }\r
80 \r
81     internal PdfStringObject(string value, PdfStringFlags flags)\r
82     {\r
83       this.value = value;\r
84       //if ((flags & PdfStringFlags.EncodingMask) == 0)\r
85       //  flags |= PdfStringFlags.PDFDocEncoding;\r
86       this.flags = flags;\r
87     }\r
88 \r
89     /// <summary>\r
90     /// Gets the number of characters in this string.\r
91     /// </summary>\r
92     public int Length\r
93     {\r
94       get { return this.value == null ? 0 : this.value.Length; }\r
95     }\r
96 \r
97     /// <summary>\r
98     /// Gets or sets the encoding.\r
99     /// </summary>\r
100     public PdfStringEncoding Encoding\r
101     {\r
102       get { return (PdfStringEncoding)(this.flags & PdfStringFlags.EncodingMask); }\r
103       set { this.flags = (this.flags & ~PdfStringFlags.EncodingMask) | ((PdfStringFlags)value & PdfStringFlags.EncodingMask); }\r
104     }\r
105 \r
106     /// <summary>\r
107     /// Gets a value indicating whether the string is a hexadecimal literal.\r
108     /// </summary>\r
109     public bool HexLiteral\r
110     {\r
111       get { return (this.flags & PdfStringFlags.HexLiteral) != 0; }\r
112       set { this.flags = value ? this.flags | PdfStringFlags.HexLiteral : this.flags & ~PdfStringFlags.HexLiteral; }\r
113     }\r
114 \r
115     PdfStringFlags flags;\r
116 \r
117     /// <summary>\r
118     /// Gets or sets the value as string\r
119     /// </summary>\r
120     public string Value\r
121     {\r
122       get { return this.value ?? ""; }\r
123       set { this.value = value ?? ""; }\r
124     }\r
125     string value;\r
126 \r
127     /// <summary>\r
128     /// Gets or sets the string value for encryption purposes.\r
129     /// </summary>\r
130     internal byte[] EncryptionValue\r
131     {\r
132       // TODO: Unicode case is not handled!\r
133       get { return this.value == null ? new byte[0] : PdfEncoders.RawEncoding.GetBytes(this.value); }\r
134       set { this.value = PdfEncoders.RawEncoding.GetString(value, 0, value.Length); }\r
135     }\r
136 \r
137     /// <summary>\r
138     /// Returns the string.\r
139     /// </summary>\r
140     public override string ToString()\r
141     {\r
142       return this.value;\r
143     }\r
144 \r
145     /// <summary>\r
146     /// Writes the string literal with encoding DOCEncoded.\r
147     /// </summary>\r
148     internal override void WriteObject(PdfWriter writer)\r
149     {\r
150       writer.WriteBeginObject(this);\r
151       writer.Write(new PdfString(this.value, this.flags));\r
152       writer.WriteEndObject();\r
153     }\r
154   }\r
155 }\r