using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Microsoft.SharePoint;
using System.IO;
using System.Web.UI;
using System.Xml.Xsl;
using System.Net.Mail;
using System.Data;
using Mullivan.Collections.Generic;
using Microsoft.SharePoint.Administration;
using System.Web;
using System.Reflection;
using System.Collections;
namespace Mullivan.SharePoint.Reminders
{
public static class RmdUtil
{
public static string GetConfigName(Guid listId)
{
return listId.ToString().Replace("-","") + "_RmdConfig";
}
/// <summary>
/// This method filters or sets and mail addresses that are related to items
/// </summary>
/// <param name="mailToAddresses"></param>
/// <param name="item"></param>
/// <returns></returns>
public static MailAddress[] GetMailToAddresses(string[] mailToAddresses, SPListItem item, SPList list)
{
if (mailToAddresses == null || mailToAddresses.Length == 0)
throw new Exception("Email can not be sent when there are no emails supplied.");
List<MailAddress> addresses = new List<MailAddress>();
foreach (string strAddress in mailToAddresses)
{
if (strAddress.StartsWith("[#") && strAddress.EndsWith("#]"))
{
if (item == null)
continue;
MailAddress ma = GetMailAddress(strAddress, item, list);
if (ma != null)
addresses.Add(ma);
}
else
addresses.Add(new MailAddress(strAddress));
}
return addresses.ToArray();
}
private static MailAddress GetMailAddress(string strAddress, SPListItem item, SPList list)
{
try
{
string userName = string.Empty;
int id = -1;
string fieldName = strAddress.Substring(2, strAddress.Length - 2);
fieldName = fieldName.Substring(0, fieldName.Length - 2);
if (fieldName.ToLower().Equals("checkoutuser"))
{
if (item.File != null && item.File.CheckedOutBy != null)
return new MailAddress(item.File.CheckedOutBy.Email);
else
return null;
}
else
{
SPField field = null;
foreach (SPField f in list.Fields)
{
if (string.Compare(f.InternalName, fieldName, true) == 0
|| string.Compare(f.Title, fieldName, true) == 0)
{
field = f;
break;
}
}
if (field == null)
return null;
string val = (string)item[field.Id];
if (string.IsNullOrEmpty(val))
return null;
string[] vals = val.Split(new string[1] { ";#" }, StringSplitOptions.RemoveEmptyEntries);
if (vals.Length > 1)
{
if (!int.TryParse(vals[0], out id))
{
id = -1;
userName = vals[1];
}
}
else
{
if (!int.TryParse(vals[0], out id))
{
id = -1;
userName = vals[0];
}
}
}
using (SPWeb web = list.ParentWeb)
{
SPListItem user = null;
if (id < 0)
user = GetUserInfo(web, userName);
else
user = GetUserInfo(web, id);
if(user == null)
return null;
object email = user["EMail"];
if (email != null)
return new MailAddress(email.ToString());
else
return null;
}
}
catch (Exception ex)
{
Logging.ServiceLog.LogException(ex);
return null;
}
}
public static List<RmdConfiguration> GetRmdConfigs(SPList list)
{
string configName = GetConfigName(list.ID);
string configuration = string.Empty;
//I used the ParentWeb because the SPList object doesn't have a property bag
using (SPWeb web = list.ParentWeb)
{
if (web.Properties.ContainsKey(configName))
configuration = list.ParentWeb.Properties[configName];
}
if (string.IsNullOrEmpty(configuration))
return null;
return RmdConfiguration.ReadConfigurations(configuration);
}
public static void SetRmdConfigs(SPList list, List<RmdConfiguration> rmdConfigs)
{
string configName = GetConfigName(list.ID);
string configuration = string.Empty;
//I used the ParentWeb because the SPList object doesn't have a property bag
configuration = RmdConfiguration.WriteConfigurations(rmdConfigs);
using (SPWeb web = list.ParentWeb)
{
if (!web.Properties.ContainsKey(configName))
web.Properties.Add(configName, configuration);
else
web.Properties[configName] = configuration;
web.Properties.Update();
web.Update();
}
}
public static RmdConfiguration FindReminder(Guid id, List<RmdConfiguration> rmdConfigs)
{
foreach(RmdConfiguration rmdConfig in rmdConfigs)
{
if (rmdConfig.Id == id)
return rmdConfig;
}
return null;
}
public static SPListItem GetUserInfo(SPWeb web, string loginName)
{
try
{
SPUser u = web.SiteUsers[loginName];
if (u == null)
return null;
return GetUserInfo(web, u.ID);
}
catch (Exception ex)
{
Logging.ServiceLog.LogException(ex);
}
return null;
}
public static SPListItem GetUserInfo(SPWeb web, int id)
{
try
{
SPList userList = web.SiteUserInfoList;
SPQuery query = new SPQuery();
query.ViewFields = "<FieldRef Name=\"Title\"/><FieldRef Name=\"Name\"/><FieldRef Name=\"EMail\"/>";
query.Query = string.Format(@"<Where><Eq><FieldRef Name='ID'/><Value Type='Int'>{0}</Value></Eq></Where>", id); // u.ID is the ID of logged in user
SPListItemCollection items = userList.GetItems(query);
if (items.Count > 0)
return items[0];
}
catch (Exception ex)
{
Logging.ServiceLog.LogException(ex);
}
return null;
}
public static XsltArgumentList GetXsltArgList(SPList list)
{
XsltArgumentList argList = new XsltArgumentList();
string defaultViewUrl, siteUrl, url, imageUrl, editFormUrl;
MullivanUtility.GetFullListUrls(list, out defaultViewUrl, out imageUrl, out url, out editFormUrl, out siteUrl);
argList.AddParam("listId", "", list.ID.ToString());
argList.AddParam("listTitle", "", list.Title);
argList.AddParam("listUrl", "", url);
argList.AddParam("listImageUrl", "", imageUrl);
argList.AddParam("listEditFormUrl", "", editFormUrl);
argList.AddParam("listDefaultViewUrl", "", defaultViewUrl);
argList.AddParam("siteUrl", "", siteUrl);
return argList;
}
public static string GetXml(SPListItem item)
{
return string.Format(
@"<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<rs:data ItemCount=""1"">
{0}
</rs:data>
</xml>", item.Xml);
}
public static string GetXml(SPListItemCollection spItems)
{
string strXml = spItems.Xml;
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(strXml);
XmlNode xnSchema = xDoc.DocumentElement.ChildNodes[0];
xDoc.DocumentElement.RemoveChild(xnSchema);
return xDoc.InnerXml;
}
}
}