Skip to content

Commit

Permalink
Added standard clipboard formats base class
Browse files Browse the repository at this point in the history
~Added ClipboardDataException initialization by native exception
!Clipboard format name reduced to first letter
+Add base class for not implemented standard windows clipboard formats
  • Loading branch information
Stadub committed Mar 12, 2015
1 parent b1557fc commit 3e612f9
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 11 deletions.
19 changes: 13 additions & 6 deletions ClipboardHelper/Clipboard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace ClipboardHelper
{
public interface IClipboard : IDisposable
{

void OpenReadOnly();
void Open();
void Clear();
Expand All @@ -30,9 +31,9 @@ public class Clipboard : IClipboard
{
private bool disposed;

private bool Owned;
private volatile bool Owned;

private IntPtr ClipboardOwner;
private volatile IntPtr ClipboardOwner;

private readonly Dictionary<string, uint> registeredFormats = new Dictionary<string, uint>();
private Dictionary<string, Func<IClipbordFormatProvider>> formatProviders= new Dictionary<string, Func<IClipbordFormatProvider>>();
Expand Down Expand Up @@ -243,7 +244,7 @@ private uint GetFormatId(string formatId)
[DllImport("user32.dll")]
public static extern uint EnumClipboardFormats(uint format);

[DllImport("user32.dll", ThrowOnUnmappableChar = true)]
[DllImport("user32.dll", ThrowOnUnmappableChar = true, CharSet = CharSet.Unicode)]
private static extern int GetClipboardFormatName(uint format,
[Out][MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszFormatName, int cchMaxCount);

Expand Down Expand Up @@ -293,7 +294,14 @@ public IEnumerable<IClipbordFormatProvider> GetAvalibleFromats(bool includeUnkno
{
if (includeUnknown)
{
foreach (var unknownformatId in unknownformatsIds)
var standartFormats =unknownformatsIds.Where(x => Enum.IsDefined(typeof (StandartClipboardFormats), x))
.ToList();

foreach (var standartFormat in standartFormats)
{
yield return new NotImplementedStandartFormat((StandartClipboardFormats) standartFormat);
}
foreach (var unknownformatId in unknownformatsIds.Except(standartFormats))
{
var formatNameBuilder = new StringBuilder(100);
GetClipboardFormatName(unknownformatId, formatNameBuilder, 100);
Expand All @@ -302,8 +310,7 @@ public IEnumerable<IClipbordFormatProvider> GetAvalibleFromats(bool includeUnkno
}
yield break;
}
throw new ClipboardDataException("Error in retreiving avalible clipbord formats",
ExceptionHelpers.GetLastWin32Exception());
throw ClipboardDataException.FromNative("Error in retreiving avalible clipbord formats");

}
}
Expand Down
7 changes: 7 additions & 0 deletions ClipboardHelper/ClipboardException.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Runtime.Serialization;
using Utils;

namespace ClipboardHelper
{
Expand Down Expand Up @@ -54,6 +55,12 @@ public ClipboardDataException() { }
public ClipboardDataException(string message) : base(message) { }
public ClipboardDataException(string message, Exception inner) : base(message, inner) { }

public static ClipboardDataException FromNative(string message)
{
var nativeExchption = ExceptionHelpers.GetLastWin32Exception();
return new ClipboardDataException(message,nativeExchption);
}

protected ClipboardDataException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}

Expand Down
18 changes: 13 additions & 5 deletions ClipboardHelper/FormatProviders/ClipboardFormatProviders.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,26 @@ public string Deserialize(byte[] data)
return Encoding.Unicode.GetString(data);
}
}
public abstract class StandartUnicodeTextProviderBase: DataFormatProvider

public abstract class StandartClipboardFormatBase : DataFormatProvider
{
protected StandartUnicodeTextProviderBase()
protected StandardFormatIdWraper formatIdWraper;

public StandartClipboardFormatBase(StandartClipboardFormats standartClipboardFormat)
{
Text = string.Empty;
this.formatIdWraper = new StandardFormatIdWraper(standartClipboardFormat);
}
private readonly StandardFormatIdWraper formatIdWraper;
}

public abstract class StandartUnicodeTextProviderBase : StandartClipboardFormatBase
{

private UnicodeStringSerializer provider;
public StandartUnicodeTextProviderBase(StandartClipboardFormats standartClipboardFormat)
: base(standartClipboardFormat)
{
this.formatIdWraper = new StandardFormatIdWraper(standartClipboardFormat);
provider = new UnicodeStringSerializer();
Text = string.Empty;
}
public override string FormatId
{
Expand Down
29 changes: 29 additions & 0 deletions ClipboardHelper/FormatProviders/UnknownFormatProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,35 @@ public void Deserialize(byte[] data)
{
Bytes = data;
}
}

public class NotImplementedStandartFormat: StandartClipboardFormatBase
{
public NotImplementedStandartFormat(StandartClipboardFormats standartClipboardFormat)
: base(standartClipboardFormat)
{
}

public override string FormatId
{
get { return formatIdWraper.FormatName; }
}

public byte[] Bytes { get; set; }

public override byte[] Serialize()
{
return Bytes;
}

public override object Data
{
get { return Bytes; }
}

protected override void DeserializeData(byte[] data)
{
Bytes = data;
}
}
}

0 comments on commit 3e612f9

Please sign in to comment.