[Nmailserver-commits] SF.net SVN: nmailserver: [129] NMail/trunk/NMail
Brought to you by:
dframpton-oss,
tmyroadctfig
|
From: <tmy...@us...> - 2007-02-03 15:46:10
|
Revision: 129
http://svn.sourceforge.net/nmailserver/?rev=129&view=rev
Author: tmyroadctfig
Date: 2007-02-03 07:45:28 -0800 (Sat, 03 Feb 2007)
Log Message:
-----------
Further work on WebAccess. Added some GPL and LGPL icons.
Modified Paths:
--------------
NMail/trunk/NMail/DataTypes/BodyStructure.cs
NMail/trunk/NMail/Helper/MimeHelper.cs
NMail/trunk/NMail/Helper/StringTokenizer.cs
NMail/trunk/NMail.RemoteAccessService.Serializers/DataTypes/BodyStructureSerializer.cs
NMail/trunk/NMail.WebAccess/App_Code/LinkButtonListItem.cs
NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.css
NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.skin
NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx
NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx.cs
NMail/trunk/NMail.WebAccess/Controls/Mail/MailError.aspx
NMail/trunk/NMail.WebAccess/Controls/Mail/MailList.ascx.cs
NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx
NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx.cs
NMail/trunk/NMail.WebAccess/Controls/Mail/MessageViewer.ascx.cs
NMail/trunk/NMail.WebAccess/Controls/Mail/SubscribedFolderList.ascx.cs
NMail/trunk/NMail.WebAccess/Default.aspx.cs
NMail/trunk/NMail.WebAccess/Mail.aspx
NMail/trunk/NMail.WebAccess/Mail.aspx.cs
NMail/trunk/NMail.WebAccess/Web.config
Added Paths:
-----------
NMail/trunk/NMail.Server/Configuration/
NMail/trunk/NMail.Server/Configuration/ServerConfiguration.cs
NMail/trunk/NMail.WebAccess/App_Code/AttachmentDataSource.cs
NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx
NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx.cs
NMail/trunk/NMail.WebAccess/Images/Crystal/
NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/
NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/
NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic.png
NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic2.png
NMail/trunk/NMail.WebAccess/Images/Crystal/copyright
NMail/trunk/NMail.WebAccess/Images/CrystalClear/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/16x16/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/16x16/filesystems/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/16x16/filesystems/folder_grey.png
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/actions/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/actions/exit.png
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/apps/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/apps/cal.png
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/filesystems/
NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/filesystems/folder_grey.png
NMail/trunk/NMail.WebAccess/Images/CrystalClear/lgpl.txt
NMail/trunk/NMail.WebAccess/Images/Skins/Default/EmptyZone.png
Modified: NMail/trunk/NMail/DataTypes/BodyStructure.cs
===================================================================
--- NMail/trunk/NMail/DataTypes/BodyStructure.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail/DataTypes/BodyStructure.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -49,6 +49,7 @@
}
public BodyStructure(MessageHeaders headers) {
+ this.headers = headers;
}
private MessageHeaders headers;
Modified: NMail/trunk/NMail/Helper/MimeHelper.cs
===================================================================
--- NMail/trunk/NMail/Helper/MimeHelper.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail/Helper/MimeHelper.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -17,6 +17,7 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
@@ -171,7 +172,8 @@
/// <returns>The parsed content type.</returns>
public static MimeContentType GetContentType(MessageHeaders headers) {
string temp;
- return GetContentType(headers[ContentTypeHeader], out temp);
+ Dictionary<string, string> temp2;
+ return GetContentType(headers[ContentTypeHeader], out temp, out temp2);
}
/// <summary>
@@ -180,9 +182,10 @@
/// </summary>
/// <param name="headers">The headers to get the content type from.</param>
/// <param name="subType">The detected sub-type.</param>
+ /// <param name="parameters">A list of parameters for the content type.</param>
/// <returns>The parsed content type.</returns>
- public static MimeContentType GetContentType(MessageHeaders headers, out string subType) {
- return GetContentType(headers[ContentTypeHeader], out subType);
+ public static MimeContentType GetContentType(MessageHeaders headers, out string subType, out Dictionary<string, string> parameters) {
+ return GetContentType(headers[ContentTypeHeader], out subType, out parameters);
}
/// <summary>
@@ -194,17 +197,40 @@
/// </remarks>
/// <param name="contentType">The header line to parse.</param>
/// <param name="subType">The detected sub-type.</param>
+ /// <param name="parameters">A list of parameters for the content type.</param>
/// <returns>The parsed content type.</returns>
- public static MimeContentType GetContentType(string contentType, out string subType) {
-
+ public static MimeContentType GetContentType(string contentType, out string subType, out Dictionary<string, string> parameters) {
+ parameters = new Dictionary<string, string>();
+
if (contentType == null) {
subType = "plain";
return MimeContentType.Text;
} else {
+ string type = null;
+
// Remove leading quotes
- string type = contentType.Replace("\"", string.Empty).Trim();
-
+ contentType = contentType.Replace("\"", string.Empty).Trim();
+
+ // Check for any parameters
+ int parameterStart = contentType.IndexOf(';');
+ if (parameterStart == -1) {
+ type = contentType;
+
+ } else {
+ type = contentType.Substring(0, parameterStart - 1);
+ string parameterList = contentType.Substring(parameterStart + 1);
+
+ // Parse out parameters
+ string[] parameterTokens = StringTokenizer.GetQuotedTokens(parameterList, ";".ToCharArray(), false);
+ for (int i = 0; i < parameterTokens.Length; i++) {
+ if (parameterTokens[i].IndexOf('=') != -1) {
+ string[] parameterParts = parameterTokens[i].Split("=".ToCharArray(), 2);
+ parameters.Add(parameterParts[0], parameterParts[1]);
+ }
+ }
+ }
+
// Chop at the slash
string[] tokens = type.Split("/".ToCharArray(), 2);
@@ -245,6 +271,29 @@
}
#endregion
+ #region Get Attachment Name
+ /// <summary>
+ /// Gets the name of an attachment.
+ /// </summary>
+ /// <param name="headers">The headers for the mime part to get the name for.</param>
+ /// <returns>The name or null if non is found.</returns>
+ public static string GetAttachmentName(MessageHeaders headers) {
+ string subType;
+ Dictionary<string, string> parameters;
+
+ GetContentType(headers, out subType, out parameters);
+
+ if (parameters.ContainsKey("name")) {
+ return parameters["name"];
+
+ } else if (parameters.ContainsKey("filename")) {
+ return parameters["filename"];
+ }
+
+ return null;
+ }
+ #endregion
+
#region GetBoundary
/// <summary>
/// Extracts the MIME boundary string from the given header.
Modified: NMail/trunk/NMail/Helper/StringTokenizer.cs
===================================================================
--- NMail/trunk/NMail/Helper/StringTokenizer.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail/Helper/StringTokenizer.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -63,6 +63,20 @@
/// </example>
/// <param name="data">The data to tokenise.</param>
/// <param name="delimiters">The delimiter to tokenise on.</param>
+ /// <param name="removeQuotes">Should quotes be removed from the extracted tokens.</param>
+ /// <returns>The array of tokens.</returns>
+ public static string[] GetQuotedTokens(string data, char[] delimiters, bool removeQuotes) {
+ return GetQuotedTokens(data, delimiters, Int32.MaxValue, removeQuotes);
+ }
+
+ /// <summary>
+ /// Gets a list of tokens respecting quotes.
+ /// </summary>
+ /// <example>
+ /// 'This "is a" string' would split into the following tokens: 'This' 'is a' 'string'.
+ /// </example>
+ /// <param name="data">The data to tokenise.</param>
+ /// <param name="delimiters">The delimiter to tokenise on.</param>
/// <param name="maximumTokens">The maximum number of tokens to return.</param>
/// <param name="removeQuotes">Should quotes be removed from the extracted tokens.</param>
/// <returns>The array of tokens.</returns>
Modified: NMail/trunk/NMail.RemoteAccessService.Serializers/DataTypes/BodyStructureSerializer.cs
===================================================================
--- NMail/trunk/NMail.RemoteAccessService.Serializers/DataTypes/BodyStructureSerializer.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.RemoteAccessService.Serializers/DataTypes/BodyStructureSerializer.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -33,7 +33,7 @@
private List<BodyStructureSerializer> parts = new List<BodyStructureSerializer>();
public List<BodyStructureSerializer> Parts {
- get { return parts = new List<BodyStructureSerializer>(); }
+ get { return this.parts; }
}
}
}
Added: NMail/trunk/NMail.Server/Configuration/ServerConfiguration.cs
===================================================================
--- NMail/trunk/NMail.Server/Configuration/ServerConfiguration.cs (rev 0)
+++ NMail/trunk/NMail.Server/Configuration/ServerConfiguration.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2004-2006 Luke Quinane and Daniel Frampton
+ *
+ * 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.
+ *
+ */
+
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Xml;
+using System.Configuration;
+using System.Net;
+
+using NMail.Configuration;
+using NMail.DataTypes;
+
+namespace NMail.Server.Configuration {
+ /// <summary>
+ /// Provides configuration settings for the NMail server implementation.
+ /// </summary>
+ public class ServerConfiguration : ConfigurationSection {
+ /// <summary>
+ /// Adds a server configuration section to the current config file.
+ /// </summary>
+ public static void AddToConfigFile() {
+ if (NMailConfigFile.Current.Sections["NMail.Server"] == null) {
+ NMailConfigFile.Current.Sections.Add("NMail.Server", new ServerConfiguration());
+ }
+ }
+
+ /// <summary>
+ /// Remove the config section from the config file.
+ /// </summary>
+ public static void RemoveFromConfigFile() {
+ if (NMailConfigFile.Current.Sections["NMail.Server"] != null) {
+ NMailConfigFile.Current.Sections.Remove("NMail.Server");
+ }
+ }
+
+ /// <summary>
+ /// Returns true if a server configuration section exists in the current
+ /// configuration.
+ /// </summary>
+ public static bool ConfigurationPresent {
+ get {
+ return (NMailConfigFile.Current.Sections["NMail.Server"] != null);
+ }
+ }
+
+ /// <summary>
+ /// The current configuration in use.
+ /// </summary>
+ public static ServerConfiguration Current {
+ get {
+ ServerConfiguration current;
+ current = (ServerConfiguration) NMailConfigFile.Current.GetSection("NMail.Server");
+
+ if (current == null) {
+ throw new ConfigurationErrorsException("NMail server configuration is missing");
+ }
+ return current;
+ }
+ }
+
+ /// <summary>
+ /// The list of users authorized to connect to the remote administration
+ /// remoting interface.
+ /// </summary>
+ [TypeConverter(typeof(CommaDelimitedStringCollectionConverter))]
+ [ConfigurationProperty("RemoteAdminAuthorizedUsers")]
+ public CommaDelimitedStringCollection RemoteAdminAuthorizedUsers {
+ get {
+ return (CommaDelimitedStringCollection) this["RemoteAdminAuthorizedUsers"];
+ }
+ set {
+ this["RemoteAdminAuthorizedUsers"] = value;
+ }
+ }
+
+ /// <summary>
+ /// The list of interfaces authorized to connect to the remote administration
+ /// remoting interface.
+ /// </summary>
+ [ConfigurationProperty("RemoteAdminClients", IsDefaultCollection = false)]
+ [ConfigurationCollection(typeof(WildcardHostConfigurationElement), AddItemName = "Client",
+ ClearItemsName = "ClearClients", RemoveItemName = "RemoveClient")]
+ public WildcardHostElementCollection RemoteAdminClients {
+ get {
+ return (WildcardHostElementCollection) this["RemoteAdminClients"];
+ }
+ }
+ }
+}
Added: NMail/trunk/NMail.WebAccess/App_Code/AttachmentDataSource.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/App_Code/AttachmentDataSource.cs (rev 0)
+++ NMail/trunk/NMail.WebAccess/App_Code/AttachmentDataSource.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2004-2007 Luke Quinane
+ *
+ * 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.
+ *
+ */
+
+using System;
+using System.Data;
+using System.Configuration;
+using System.Collections.Generic;
+using System.Web;
+using System.Web.Security;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+using System.Web.UI.WebControls.WebParts;
+using System.Web.UI.HtmlControls;
+
+using NMail.DataTypes;
+using NMail.Helper;
+
+namespace NMail.WebAccess
+{
+ /// <summary>
+ /// A data source for message attachments.
+ /// </summary>
+ public static class AttachmentDataSource
+ {
+ public static List<AttachmentDetails> GetAttachmentDetails(Message message)
+ {
+ List<AttachmentDetails> result = new List<AttachmentDetails>();
+
+ if (message.MultipartBody)
+ {
+ for (int i = 0; i < message.MimeParts.Count; i++)
+ {
+ result.Add(new AttachmentDetails(message.MimeParts[i], i + 1));
+ }
+ }
+
+ return result;
+ }
+ }
+
+ /// <summary>
+ /// Details for an attachment.
+ /// </summary>
+ public class AttachmentDetails
+ {
+ public AttachmentDetails(IMessageBodyPart mimePart, int partNumber)
+ {
+ this.partNumber = partNumber;
+
+ // Get the name of the attachment
+ this.name = MimeHelper.GetAttachmentName(mimePart.Headers);
+ if (name == null)
+ {
+ name = string.Format("Untitled: {0}", partNumber);
+ }
+
+ this.size = mimePart.BodyData.Length;
+
+ // Get the content type
+ Dictionary<string, string> parameters;
+ this.contentType = MimeHelper.GetContentType(mimePart.Headers, out this.contentSubType, out parameters);
+ }
+
+ private int partNumber;
+
+ /// <summary>
+ /// The part number for this attachment.
+ /// </summary>
+ public int PartNumber
+ {
+ get { return partNumber; }
+ set { partNumber = value; }
+ }
+
+ private string name;
+
+ /// <summary>
+ /// The filename for this attachment.
+ /// </summary>
+ public string Name
+ {
+ get { return name; }
+ set { name = value; }
+ }
+
+ private int size;
+
+ /// <summary>
+ /// The size of the attachment in bytes.
+ /// </summary>
+ public int Size
+ {
+ get { return size; }
+ set { size = value; }
+ }
+
+ private MimeContentType contentType;
+
+ /// <summary>
+ /// The content type for the attachment.
+ /// </summary>
+ public MimeContentType ContentType
+ {
+ get { return contentType; }
+ set { contentType = value; }
+ }
+
+ private string contentSubType;
+
+ /// <summary>
+ /// The content sub-type for the attachment.
+ /// </summary>
+ public string ContentSubType
+ {
+ get { return contentSubType; }
+ set { contentSubType = value; }
+ }
+ }
+}
\ No newline at end of file
Modified: NMail/trunk/NMail.WebAccess/App_Code/LinkButtonListItem.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/App_Code/LinkButtonListItem.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/App_Code/LinkButtonListItem.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -17,8 +17,19 @@
this.clickHandler = clickHandler;
}
+ public LinkButtonListItem(string text, string itemStyleClass, string imageSkinId, EventHandler clickHandler)
+ {
+ this.text = text;
+ this.itemStyleClass = itemStyleClass;
+ this.imageSkinId = imageSkinId;
+ this.clickHandler = clickHandler;
+ }
+
private string text;
+ /// <summary>
+ /// The text of the link.
+ /// </summary>
public string Text
{
get
@@ -29,15 +40,30 @@
private string itemStyleClass;
+ /// <summary>
+ /// The style for the link button.
+ /// </summary>
public string ItemStyleClass
{
get { return itemStyleClass; }
set { itemStyleClass = value; }
}
-
+ private string imageSkinId;
+
+ /// <summary>
+ /// The Skin Id for the image.
+ /// </summary>
+ public string ImageSkinId
+ {
+ get { return imageSkinId; }
+ }
+
private EventHandler clickHandler;
+ /// <summary>
+ /// The handler executed when the link is clicked on.
+ /// </summary>
public EventHandler ClickHandler
{
get
Modified: NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.css
===================================================================
--- NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.css 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.css 2007-02-03 15:45:28 UTC (rev 129)
@@ -8,8 +8,14 @@
a
{
color: #1e2e21;
+ text-decoration: none;
}
+a:hover
+{
+ text-decoration: underline;
+}
+
.LoginBody
{
font-family: Sans-Serif;
@@ -33,10 +39,9 @@
.ViewButton
{
- text-align: center;
background-color: #B8DECF;
height: 30px;
- vertical-align: middle;
+ vertical-align: text-bottom;
padding-left: 0.5em;
padding-right: 0.5em;
margin: 2px 2px 2px 2px;
@@ -60,6 +65,7 @@
{
width: 100%;
background-color: White;
+ overflow: auto;
}
.MailListSelectedItem
@@ -89,6 +95,11 @@
font-size: large;
}
+.WebPartTitleVerb
+{
+ font-size: medium;
+}
+
.WebPart
{
background-color: White;
Modified: NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.skin
===================================================================
--- NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.skin 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/App_Themes/Default/Default.skin 2007-02-03 15:45:28 UTC (rev 129)
@@ -15,4 +15,13 @@
*
--%>
+<%@ Register Src="~/Controls/Mail/SubscribedFolderList.ascx" TagName="SubscribedFolderList" TagPrefix="uc2" %>
+
+
<asp:Image runat="server" SkinId="LoginBanner" ImageUrl="~/Images/Skins/Default/LoginBanner.jpg" />
+
+<asp:Image runat="server" SkinId="MailButtonImage" ImageUrl="~/Images/Crystal/22x22/actions/mail_generic.png" />
+<asp:Image runat="server" SkinId="CalendarButtonImage" ImageUrl="~/Images/CrystalClear/22x22/apps/cal.png" />
+<asp:Image runat="server" SkinId="LogoutButtonImage" ImageUrl="~/Images/CrystalClear/22x22/actions/exit.png" />
+
+<uc2:SubscribedFolderList runat="server" SkinID="FolderList" TitleIconImageUrl="~/Images/CrystalClear/22x22/filesystems/folder_grey.png" FolderImageUrl="~/Images/CrystalClear/16x16/filesystems/folder_grey.png" />
\ No newline at end of file
Modified: NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx 2007-02-03 15:45:28 UTC (rev 129)
@@ -20,7 +20,7 @@
<asp:Repeater ID="Repeater" runat="server">
<ItemTemplate>
<div class='<%# Eval("ItemStyleClass") %>'>
- <asp:LinkButton runat="server" ID="LinkButton" Text='<%# Eval("Text") %>' />
+ <asp:LinkButton runat="server" ID="LinkButton" />
</div>
</ItemTemplate>
</asp:Repeater>
Modified: NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/LinkButtonList.ascx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -49,6 +49,19 @@
// Link this task's button with its click handler
LinkButton button = (LinkButton)control;
button.Click += item.ClickHandler;
+
+ // Add an image if available
+ if (item.ImageSkinId != null)
+ {
+ Image image = new Image();
+ image.SkinID = item.ImageSkinId;
+ button.Controls.Add(image);
+ }
+
+ // Add the text
+ Literal text = new Literal();
+ text.Text = item.Text;
+ button.Controls.Add(text);
}
}
Added: NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx (rev 0)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,18 @@
+<%--
+ * Copyright 2004-2007 Luke Quinane
+ *
+ * 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.
+ *
+--%>
+
+<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Attachment.aspx.cs" Inherits="Controls_Mail_Attachment" %>
Added: NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx.cs (rev 0)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/Attachment.aspx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2004-2007 Luke Quinane
+ *
+ * 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.
+ *
+ */
+
+using System;
+using System.Data;
+using System.Configuration;
+using System.Collections;
+using System.Text;
+using System.Web;
+using System.Web.Security;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+using System.Web.UI.WebControls.WebParts;
+using System.Web.UI.HtmlControls;
+
+using NMail.DataTypes;
+using NMail.Helper;
+
+/// <summary>
+/// The code for the mail attachment form.
+/// </summary>
+public partial class Controls_Mail_Attachment : System.Web.UI.Page
+{
+ private int partNumber = -1;
+
+ /// <summary>
+ /// The MIME part to download.
+ /// </summary>
+ public int PartNumber
+ {
+ get { return partNumber; }
+ }
+
+ private int messageId = -1;
+
+ /// <summary>
+ /// The message Id displayed in the page.
+ /// </summary>
+ public int MessageId
+ {
+ get { return messageId; }
+ }
+
+ private int folderId = -1;
+
+ /// <summary>
+ /// The folder the message is in.
+ /// </summary>
+ public int FolderId
+ {
+ get { return folderId; }
+ }
+
+ /// <summary>
+ /// Extracts the message and folder Ids and part number from the query string.
+ /// </summary>
+ protected void ExtractQueryStringParams()
+ {
+ foreach (string key in Request.QueryString.AllKeys)
+ {
+ if (key.Trim().ToLower() == "messageid")
+ {
+ this.messageId = Int32.Parse(Request.QueryString[key]);
+ }
+ else if (key.Trim().ToLower() == "folderid")
+ {
+ this.folderId = Int32.Parse(Request.QueryString[key]);
+ }
+ else if (key.Trim().ToLower() == "partNumber")
+ {
+ this.partNumber = Int32.Parse(Request.QueryString[key]);
+ }
+ }
+ }
+
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ ExtractQueryStringParams();
+
+ // Ensure there is a valid folder Id
+ if (this.folderId == -1)
+ {
+ throw new ArgumentException("No folder selected.");
+ return;
+ }
+
+ // Ensure there is a valid message Id
+ if (this.messageId == -1)
+ {
+ throw new ArgumentException("No message selected.");
+ return;
+ }
+
+ // Ensure there is a valid part number
+ if (this.partNumber == -1)
+ {
+ throw new ArgumentException("No MIME part selected.");
+ return;
+ }
+
+ // Get our session variables
+ string authToken = (string)Session["AuthToken"];
+ RemoteAccessService.RemoteAccessService ras = (RemoteAccessService.RemoteAccessService)Session["RAS"];
+
+ // Get the part to send
+ string base64Body = ras.GetMessageMimePart(authToken, this.partNumber, this.messageId, this.folderId);
+ ByteString bodyData = new ByteString(Convert.FromBase64String(base64Body), Encoding.UTF8);
+ SimpleBodyPart body = MessageHelper.ParseMessage(bodyData);
+
+ // Send the part to the client
+ Response.ContentType = body.Headers["Content-type"];
+ Response.Write(body.BodyData.ToString());
+ }
+}
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/MailError.aspx
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/MailError.aspx 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/MailError.aspx 2007-02-03 15:45:28 UTC (rev 129)
@@ -28,7 +28,7 @@
<div>
<h1>Error</h1>
An error has occurred trying to view your message or download an attachment.
- Click <a onclick="refresh()">here</a> to try again.
+ Click <a onclick="window.location.reload(false)">here</a> to try again.
</div>
</form>
</body>
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/MailList.ascx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/MailList.ascx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/MailList.ascx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -19,9 +19,11 @@
using System.Data;
using System.Configuration;
using System.Collections;
+using System.ComponentModel;
using System.Web;
using System.Web.Security;
using System.Web.UI;
+using System.Web.UI.Design;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
@@ -31,6 +33,8 @@
/// <summary>
/// The code for the mail list control.
/// </summary>
+[Designer(typeof(ControlDesigner))]
+[Themeable(true)]
public partial class Controls_Mail_MailList : System.Web.UI.UserControl, IWebPart
{
protected void Page_Init(object sender, EventArgs e)
@@ -159,7 +163,7 @@
{
get
{
- return (this.folderName == null) ? " " : this.folderName;
+ return (this.folderName == null) ? "No folder selected" : this.folderName;
}
set
{
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx 2007-02-03 15:45:28 UTC (rev 129)
@@ -33,9 +33,11 @@
<!-- The attachments -->
<asp:Repeater ID="AttachmentsRepeater" runat="server">
<ItemTemplate>
- <!-- Name -->
- <!-- Size -->
- <!-- Type -->
+ <asp:LinkButton ID="AttachmentDownloadButton" runat="server">
+ <asp:Image ID="AttachmentImage" runat="server" />
+ <asp:Label ID="AttachmentNameLbl" runat="server" />
+ <asp:Label ID="SizeLbl" runat="server" />
+ </asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
</div>
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/MessageBody.aspx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -19,6 +19,7 @@
using System.Data;
using System.Configuration;
using System.Collections;
+using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Web;
@@ -38,7 +39,7 @@
/// </summary>
public partial class Controls_Mail_MessageBody : System.Web.UI.Page
{
- private int messageId;
+ private int messageId = -1;
/// <summary>
/// The message Id displayed in the page.
@@ -48,7 +49,7 @@
get { return messageId; }
}
- private int folderId;
+ private int folderId = -1;
/// <summary>
/// The folder the message is in.
@@ -56,6 +57,16 @@
public int FolderId
{
get { return folderId; }
+ }
+
+ private Message message;
+
+ /// <summary>
+ /// The message displayed in this form.
+ /// </summary>
+ public Message Message
+ {
+ get { return message; }
}
/// <summary>
@@ -99,8 +110,9 @@
// Search for the best part
for (int i = 0; i < bodyStructure.Count; i++)
{
+ Dictionary<string, string> parameters;
string subType;
- MimeContentType contentType = MimeHelper.GetContentType(bodyStructure[i].Headers, out subType);
+ MimeContentType contentType = MimeHelper.GetContentType(bodyStructure[i].Headers, out subType, out parameters);
if (contentType == MimeContentType.Text)
{
@@ -118,10 +130,10 @@
}
}
- protected void Page_Load(object sender, EventArgs e)
- {
+ protected void Page_Init(object sender, EventArgs e)
+ {
ExtractQueryStringParams();
-
+
// Ensure there is a valid folder Id
if (this.folderId == -1)
{
@@ -139,8 +151,8 @@
}
// Get our session variables
- string authToken = (string) Session["AuthToken"];
- RemoteAccessService.RemoteAccessService ras = (RemoteAccessService.RemoteAccessService) Session["RAS"];
+ string authToken = (string)Session["AuthToken"];
+ RemoteAccessService.RemoteAccessService ras = (RemoteAccessService.RemoteAccessService)Session["RAS"];
// Get the body structure
BodyStructureSerializer bs = ras.GetMessageStructure(authToken, messageId, folderId);
@@ -150,20 +162,52 @@
int bodyPartNumber;
bool htmlBody;
FindMimePartToDisplay(bodyStructure, out bodyPartNumber, out htmlBody);
-
+
// Get the part to display
string base64Body = ras.GetMessageMimePart(authToken, bodyPartNumber, messageId, folderId);
ByteString bodyData = new ByteString(Convert.FromBase64String(base64Body), Encoding.UTF8);
- SimpleBodyPart body = MessageHelper.ParseMessage(bodyData);
+ this.message = new Message(bodyData);
// Ensure all nasty stuff is escaped
if (htmlBody)
{
- this.MessageBody.Text = HtmlEscaper.EscapeScriptsAndImages(body.Data.ToString());
+ this.MessageBody.Text = HtmlEscaper.EscapeScriptsAndImages(this.message.Data.ToString());
}
else
{
- this.MessageBody.Text = HtmlEscaper.EscapeAll(body.Data.ToString());
+ this.MessageBody.Text = HtmlEscaper.EscapeAll(this.message.Data.ToString());
}
- }
+
+ this.AttachmentsRepeater.ItemDataBound += new RepeaterItemEventHandler(AttachmentsRepeater_ItemDataBound);
+ }
+
+ protected void Page_PreRender(object sender, EventArgs e)
+ {
+ // Setup and bind to the data source
+ ObjectDataSource attachmentDataSource = new ObjectDataSource("NMail.WebAccess.AttachmentDataSource", "GetAttachmentDetails");
+ attachmentDataSource.Selecting += new ObjectDataSourceSelectingEventHandler(attachmentDataSource_Selecting);
+
+ this.AttachmentsRepeater.DataSource = attachmentDataSource;
+ this.AttachmentsRepeater.DataBind();
+ }
+
+ void attachmentDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
+ {
+ e.InputParameters.Add("message", this.message);
+ }
+
+ void AttachmentsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
+ {
+ LinkButton downloadButton = (LinkButton) e.Item.FindControl("AttachmentDownloadButton");
+ Image image = (Image) e.Item.FindControl("AttachmentImage");
+ Label name = (Label) e.Item.FindControl("AttachmentNameLbl");
+ Label size = (Label) e.Item.FindControl("SizeLbl");
+ AttachmentDetails item = (AttachmentDetails)e.Item.DataItem;
+
+ if (downloadButton != null && image != null && name != null && size != null && item != null)
+ {
+ name.Text = item.Name;
+ size.Text = string.Format("{0} bytes", item.Size);
+ }
+ }
}
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/MessageViewer.ascx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/MessageViewer.ascx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/MessageViewer.ascx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -142,7 +142,7 @@
get { return null; }
}
- private string title = " ";
+ private string title = "No message selected";
public string Title
{
Modified: NMail/trunk/NMail.WebAccess/Controls/Mail/SubscribedFolderList.ascx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Controls/Mail/SubscribedFolderList.ascx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Controls/Mail/SubscribedFolderList.ascx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -19,10 +19,12 @@
using System.Data;
using System.Configuration;
using System.Collections;
+using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
+using System.Web.UI.Design;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
@@ -32,7 +34,9 @@
/// <summary>
/// The code for the subscribed folder list control.
/// </summary>
-public partial class Controls_Mail_SubscribedFolderList : System.Web.UI.UserControl
+[Designer(typeof(ControlDesigner))]
+[Themeable(true)]
+public partial class Controls_Mail_SubscribedFolderList : System.Web.UI.UserControl, IWebPart
{
protected void Page_Init(object sender, EventArgs e)
{
@@ -71,6 +75,7 @@
result.Append("<span class='");
+ // Add the folder style name
if (f.UnreadMessages > 0)
{
result.Append("SubscribedFolderUnread");
@@ -81,6 +86,12 @@
}
result.Append("'>");
+ // Add the folder image if present
+ if (this.folderImageUrl != null)
+ {
+ result.Append(string.Format("<img style='border: 0px' src='{0}' /> ", ResolveUrl(this.folderImageUrl)));
+ }
+
result.Append(f.FullFolderName);
if (f.UnreadMessages > 0) {
@@ -103,6 +114,17 @@
}
}
+ private string folderImageUrl;
+
+ /// <summary>
+ /// The URL of the image to show next to the folders.
+ /// </summary>
+ public string FolderImageUrl
+ {
+ get { return folderImageUrl; }
+ set { folderImageUrl = value; }
+ }
+
private event EventHandler selectedFolderIdChanged;
/// <summary>
@@ -119,4 +141,80 @@
this.selectedFolderIdChanged -= value;
}
}
+
+ #region IWebPart Members
+
+ private string catalogIconImageUrl;
+
+ public string CatalogIconImageUrl
+ {
+ get
+ {
+ return this.catalogIconImageUrl;
+ }
+ set
+ {
+ this.catalogIconImageUrl = value;
+ }
+ }
+
+ private string description = "Displays the list of subscribed folders.";
+
+ public string Description
+ {
+ get
+ {
+ return this.description;
+ }
+ set
+ {
+ this.description = value;
+ }
+ }
+
+ public string Subtitle
+ {
+ get { return null; }
+ }
+
+ public string Title
+ {
+ get
+ {
+ return string.Format("{0}'s Folders", HttpContext.Current.User.Identity.Name);
+ }
+ set
+ {
+ throw new NotSupportedException("Can't set the title manually for the subscribed folder list.");
+ }
+ }
+
+ private string titleIconImageUrl;
+
+ public string TitleIconImageUrl
+ {
+ get
+ {
+ return this.titleIconImageUrl;
+ }
+ set
+ {
+ this.titleIconImageUrl = value;
+ }
+ }
+
+ private string titleUrl;
+
+ public string TitleUrl
+ {
+ get
+ {
+ return this.titleUrl;
+ }
+ set
+ {
+ this.titleUrl = value;
+ }
+ }
+ #endregion
}
\ No newline at end of file
Modified: NMail/trunk/NMail.WebAccess/Default.aspx.cs
===================================================================
--- NMail/trunk/NMail.WebAccess/Default.aspx.cs 2007-02-03 08:36:53 UTC (rev 128)
+++ NMail/trunk/NMail.WebAccess/Default.aspx.cs 2007-02-03 15:45:28 UTC (rev 129)
@@ -19,8 +19,9 @@
// Setup the view list
List<LinkButtonListItem> viewItems = new List<LinkButtonListItem>();
- viewItems.Add(new LinkButtonListItem("Mail", "ViewButton", new EventHandler(ShowMailView_Clicked)));
- viewItems.Add(new LinkButtonListItem("Calendar", "ViewButton", new EventHandler(ShowCalendarView_Clicked)));
+ viewItems.Add(new LinkButtonListItem(" Mail", "ViewButton", "MailButtonImage", new EventHandler(ShowMailView_Clicked)));
+ viewItems.Add(new LinkButtonListItem(" Calendar", "ViewButton", "CalendarButtonImage", new EventHandler(ShowCalendarView_Clicked)));
+ viewItems.Add(new LinkButtonListItem(" Logout", "ViewButton", "LogoutButtonImage", new EventHandler(Logout_Clicked)));
this.ViewList.SetListItems(viewItems);
}
@@ -33,4 +34,11 @@
protected void ShowCalendarView_Clicked(object sender, EventArgs ea)
{
}
+
+ protected void Logout_Clicked(object sender, EventArgs ea)
+ {
+ Session.Abandon();
+ FormsAuthentication.SignOut();
+ FormsAuthentication.RedirectToLoginPage();
+ }
}
Added: NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic2.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/Crystal/22x22/actions/mail_generic2.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/Crystal/copyright
===================================================================
--- NMail/trunk/NMail.WebAccess/Images/Crystal/copyright (rev 0)
+++ NMail/trunk/NMail.WebAccess/Images/Crystal/copyright 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,30 @@
+This package was debianized by Morten Hustveit <mo...@if...> on
+Sun, 2 Jun 2002 21:37:04 +0200.
+
+It was downloaded from:
+ftp://ftp.everaldo.com/crystal/crystal_beta.tar.gz
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+On Debian systems, the complete text of the GNU General Public
+License can be found in `/usr/share/common-licenses/GPL'.
+
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.1 or
+ any later version published by the Free Software Foundation; with no
+ Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+ Texts. A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
Added: NMail/trunk/NMail.WebAccess/Images/CrystalClear/16x16/filesystems/folder_grey.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/CrystalClear/16x16/filesystems/folder_grey.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/actions/exit.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/actions/exit.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/apps/cal.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/apps/cal.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/filesystems/folder_grey.png
===================================================================
(Binary files differ)
Property changes on: NMail/trunk/NMail.WebAccess/Images/CrystalClear/22x22/filesystems/folder_grey.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: NMail/trunk/NMail.WebAccess/Images/CrystalClear/lgpl.txt
===================================================================
--- NMail/trunk/NMail.WebAccess/Images/CrystalClear/lgpl.txt (rev 0)
+++ NMail/trunk/NMail.WebAccess/Images/CrystalClear/lgpl.txt 2007-02-03 15:45:28 UTC (rev 129)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operatin...
[truncated message content] |