From 8c600ca0d39d33a0582f6eed7e338230fd172b6a Mon Sep 17 00:00:00 2001 From: briandunnington Date: Mon, 2 Nov 2009 23:30:04 +0000 Subject: [PATCH] RC4 release; Feed Monitor date parsing fix --- .../NET/libraries/Growl.Connector.dll | Bin 61440 -> 61440 bytes .../NET/libraries/Growl.CoreLibrary.dll | Bin 24576 -> 24576 bytes Growl Extras/Bubbles/Bubbles/BubblesWindow.cs | 2 +- .../Degree Display/DegreeWindow.cs | 2 +- .../Feed Monitor Deployment.vdproj | 6 +- .../GrowlExtras.FeedMonitor.csproj | 1 + .../Properties/AssemblyInfo.cs | 2 +- .../_source/GenericFeedParser.cs | 4 +- .../_source/Rfc822DateTime.cs | 307 ++++++++++++++++++ .../libraries/Growl.CoreLibrary.dll | Bin 24576 -> 24576 bytes .../libraries/Growl.DisplayStyle.dll | Bin 49152 -> 49152 bytes .../Growl ITunes Plugin/GrowlPlugin.cs | 4 +- .../ThisApplication.cs | 5 + .../GrowlOutlookAddInSetup | 6 +- .../Deployment/Deployment.vdproj | 10 +- .../IPhone Style Display/IphoneWindow.cs | 2 +- .../NotifyDisplay/NotifyWindow.cs | 11 +- .../Sticky Note/StickyNoteWindow.cs | 2 +- Growl/Growl.Connector/CallbackContext.cs | 20 ++ Growl/Growl.Connector/CallbackData.cs | 7 + Growl/Growl.Connector/ConnectorBase.cs | 3 +- Growl/Growl.Connector/Cryptography.cs | 59 +++- Growl/Growl.Connector/Growl.Connector.csproj | 2 - Growl/Growl.Connector/GrowlException.cs | 2 +- Growl/Growl.Connector/Header.cs | 2 +- Growl/Growl.Connector/Key.cs | 5 +- Growl/Growl.Connector/MessageBuilder.cs | 8 +- Growl/Growl.Connector/MessageParser.cs | 2 +- Growl/Growl.Connector/NotificationType.cs | 8 +- .../Properties/AssemblyInfo.cs | 2 +- .../Growl.CoreLibrary.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- Growl/Growl.Daemon/AsyncSocket.cs | 13 + Growl/Growl.Daemon/BonjourService.cs | 8 + Growl/Growl.Daemon/Growl.Daemon.csproj | 2 - Growl/Growl.Daemon/GrowlServer.cs | 36 +- Growl/Growl.Daemon/MessageHandler.cs | 51 +-- Growl/Growl.Daemon/Properties/AssemblyInfo.cs | 2 +- Growl/Growl.Daemon/RequestInfo.cs | 4 + Growl/Growl.Daemon/SubscriptionConnector.cs | 66 +++- .../DefaultSettingsPanel.cs | 1 - Growl/Growl.DisplayStyle/ExpandingLabel.cs | 2 +- Growl/Growl.DisplayStyle/FadeAnimator.cs | 15 +- .../Growl.DisplayStyle.csproj | 2 - .../Growl.DisplayStyle/NotificationWindow.cs | 4 + Growl/Growl.DisplayStyle/PopupAnimator.cs | 11 +- .../Properties/AssemblyInfo.cs | 2 +- Growl/Growl.DisplayStyle/SettingsPanelBase.cs | 1 - Growl/Growl.DisplayStyle/Utility.cs | 38 ++- Growl/Growl.DisplayStyle/Win32Animator.cs | 7 + .../Growl.Displays.Plain.csproj | 2 - .../PlainSettingsPanel.cs | 1 - Growl/Growl.Displays.Plain/PlainWindow.cs | 1 - .../Properties/AssemblyInfo.cs | 2 +- .../Growl.Displays.Smokestack.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- .../SmokestackSettingsPanel.cs | 1 - .../SmokestackWindow.cs | 3 +- .../Growl.Displays.Standard.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- .../StandardSettingsPanel.cs | 1 - .../Growl.Displays.Standard/StandardWindow.cs | 3 +- .../Growl.Displays.Toast.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- Growl/Growl.Displays.Toast/ToastWindow.cs | 3 +- .../Growl.Displays.Visor.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- .../VisorSettingsPanel.cs | 1 - Growl/Growl.Displays.Visor/VisorWindow.cs | 1 - .../Growl.Localization.de-DE.csproj | 2 - .../Growl.Localization.en-GB.csproj | 2 - .../Growl.Localization.ja-JP.csproj | 2 - .../Growl.Localization.nb-NO.csproj | 2 - .../Growl.Localization.nl-NL.csproj | 2 - Growl/Growl.UDPLegacy/Growl.UDPLegacy.csproj | 2 - .../Properties/AssemblyInfo.cs | 2 +- Growl/Growl.sln | 55 +++- Growl/Growl/AddComputer.cs | 1 - Growl/Growl/ChooseForwarding.cs | 1 - Growl/Growl/Growl.csproj | 3 +- Growl/Growl/MainForm.cs | 67 ++-- Growl/Growl/Properties/AssemblyInfo.cs | 4 +- Growl/Growl/Properties/Settings.Designer.cs | 54 +++ Growl/Growl/Properties/Settings.settings | 16 +- Growl/Growl/SplashScreen.cs | 1 - Growl/Growl/UI/EmailForwardInputs.cs | 3 +- Growl/Growl/UI/ForwardDestinationInputs.cs | 1 - .../UI/ForwardDestinationSettingsPanel.cs | 1 - Growl/Growl/UI/MissedNotificationsWindow.cs | 1 - Growl/Growl/UI/OnOffButton.cs | 1 - Growl/Growl/UI/PasswordManagerControl.cs | 1 - Growl/Growl/UI/ProwlForwardInputs.cs | 1 - Growl/Growl/UI/TransparentPanel.cs | 1 - Growl/Growl/UI/TwitterForwardInputs.cs | 1 - Growl/Growl/_source/AutoUpdate/UpdateForm.cs | 1 - Growl/Growl/_source/Bonjour.cs | 1 + Growl/Growl/_source/Controller.cs | 13 +- .../Growl/_source/EmailForwardDestination.cs | 21 +- Growl/Growl/_source/GNTPForwardDestination.cs | 30 ++ .../_source/Installation/InstallDisplay.cs | 1 - .../_source/Installation/InstallLanguage.cs | 1 - Growl/Growl/_source/Program.cs | 10 +- Growl/Growl/_source/Subscription.cs | 70 +--- Growl/Growl/app.config | 12 + Growl/Growl/release_notes.txt | 22 ++ Growl/Growl/update.manifest | 6 +- Growl/Test App/Form1.Designer.cs | 14 +- Growl/Test App/Form1.cs | 73 ++++- .../Windows Deployment.vdproj | 244 +++++++------- 109 files changed, 1106 insertions(+), 428 deletions(-) create mode 100644 Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/Rfc822DateTime.cs diff --git a/Growl Connectors/NET/libraries/Growl.Connector.dll b/Growl Connectors/NET/libraries/Growl.Connector.dll index fb359401da3863b0a9897472a332d536e80593b9..e666babea82d2cebc067e95ef681add1dbd724be 100644 GIT binary patch literal 61440 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 delta 22230 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 diff --git a/Growl Connectors/NET/libraries/Growl.CoreLibrary.dll b/Growl Connectors/NET/libraries/Growl.CoreLibrary.dll index 16059a486a2d1eb97a5de2cbf4e2f90e9982b7d1..b5d0f83a463b8dab743057c05159b94f32a2afc7 100644 GIT binary patch delta 230 zcmV!cj7g`dTjaL}W!b-0 ztK}vKad-~Q0C#Iq!TEM&&!pGgQV!m{<9$*q0Gsxhbx*8$9AMvA1J*Ot^wi_aVv`d? zGWhu;zbg<@dc|VoK_Wl`$A8w(@gu9%rX(T>t<8 delta 230 zcmV4Hu|1hDz7 zpH(DuUN!}t!$huk9~4vVs18_4u+O*V{w!cij_qSqpSsuSwkJ&r3k|O(3O>8y7lV75 zS13k44(1^3NE?xxzGLsWD#RDzl%#+(R84xuZzA*C1 g_C%a7jumK7xe&7iHHZrV7PE~&Z29yzsXwEzGB diff --git a/Growl Extras/Bubbles/Bubbles/BubblesWindow.cs b/Growl Extras/Bubbles/Bubbles/BubblesWindow.cs index 5da19f5..075342d 100644 --- a/Growl Extras/Bubbles/Bubbles/BubblesWindow.cs +++ b/Growl Extras/Bubbles/Bubbles/BubblesWindow.cs @@ -172,7 +172,7 @@ protected override void OnShown(EventArgs e) void BubblesWindow_AutoClosing(object sender, FormClosingEventArgs e) { this.fadeOutTimer = new Timer(); - this.fadeOutTimer.Interval = 50; + this.fadeOutTimer.Interval = 10; this.fadeOutTimer.Tick += new EventHandler(fadeOutTimer_Tick); this.fadeOutTimer.Start(); e.Cancel = true; // IMPORTANT! diff --git a/Growl Extras/Degree Display/Degree Display/DegreeWindow.cs b/Growl Extras/Degree Display/Degree Display/DegreeWindow.cs index fcd329f..24d29d7 100644 --- a/Growl Extras/Degree Display/Degree Display/DegreeWindow.cs +++ b/Growl Extras/Degree Display/Degree Display/DegreeWindow.cs @@ -172,7 +172,7 @@ protected override void OnShown(EventArgs e) void DegreeWindow_AutoClosing(object sender, FormClosingEventArgs e) { this.fadeOutTimer = new Timer(); - this.fadeOutTimer.Interval = 50; + this.fadeOutTimer.Interval = 10; this.fadeOutTimer.Tick += new EventHandler(fadeOutTimer_Tick); this.fadeOutTimer.Start(); e.Cancel = true; // IMPORTANT! diff --git a/Growl Extras/Feed Monitor/Feed Monitor Deployment/Feed Monitor Deployment.vdproj b/Growl Extras/Feed Monitor/Feed Monitor Deployment/Feed Monitor Deployment.vdproj index 90827fc..3632787 100644 --- a/Growl Extras/Feed Monitor/Feed Monitor Deployment/Feed Monitor Deployment.vdproj +++ b/Growl Extras/Feed Monitor/Feed Monitor Deployment/Feed Monitor Deployment.vdproj @@ -278,14 +278,14 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Feed Monitor" - "ProductCode" = "8:{BD7EE876-9F0E-4C2D-8B25-BDA55F54A594}" - "PackageCode" = "8:{FA534258-825F-4AA3-843E-7B3521B408C5}" + "ProductCode" = "8:{E5CA6A2A-3D51-4E09-AAD9-D47870DB4452}" + "PackageCode" = "8:{8FAFB384-4FC1-4A8D-8319-A0B07EE31F42}" "UpgradeCode" = "8:{E8D784D8-949E-4CC9-BA80-A316D25574D7}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.0.4" + "ProductVersion" = "8:1.0.5" "Manufacturer" = "8:element code project" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/GrowlExtras.FeedMonitor.csproj b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/GrowlExtras.FeedMonitor.csproj index 0de9ac8..aa5cbaa 100644 --- a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/GrowlExtras.FeedMonitor.csproj +++ b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/GrowlExtras.FeedMonitor.csproj @@ -104,6 +104,7 @@ + diff --git a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/Properties/AssemblyInfo.cs b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/Properties/AssemblyInfo.cs index aa168da..cba8f8a 100644 --- a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/Properties/AssemblyInfo.cs +++ b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/Properties/AssemblyInfo.cs @@ -33,4 +33,4 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.4.0")] +[assembly: AssemblyFileVersion("1.0.5.0")] diff --git a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/GenericFeedParser.cs b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/GenericFeedParser.cs index 05c5bd7..4c53f37 100644 --- a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/GenericFeedParser.cs +++ b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/GenericFeedParser.cs @@ -84,8 +84,8 @@ public FeedInfo Parse(XmlReader reader) case "pubDate": case "issued": DateTime dt; - DateTime.TryParse(d[k], out dt); - itm.PubDate = dt != DateTime.MinValue ? dt : DateTime.Now; + bool ok = Rfc822DateTime.TryParse(d[k], out dt); + itm.PubDate = ok ? dt : DateTime.Now; break; case "content": case "description": diff --git a/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/Rfc822DateTime.cs b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/Rfc822DateTime.cs new file mode 100644 index 0000000..eefb5fb --- /dev/null +++ b/Growl Extras/Feed Monitor/GrowlExtras.FeedMonitor/_source/Rfc822DateTime.cs @@ -0,0 +1,307 @@ +using System; +using System.Globalization; + +namespace GrowlExtras.FeedMonitor +{ + ///

+ /// Provides methods for converting structures + /// to and from the equivalent RFC 822 + /// string representation. + /// + public class Rfc822DateTime + { + //============================================================ + // Private members + //============================================================ + #region Private Members + /// + /// Private member to hold array of formats that RFC 822 date-time representations conform to. + /// + private static string[] formats = new string[0]; + /// + /// Private member to hold the DateTime format string for representing a DateTime in the RFC 822 format. + /// + private const string format = "ddd, dd MMM yyyy HH:mm:ss K"; + #endregion + + //============================================================ + // Public Properties + //============================================================ + #region Rfc822DateTimeFormat + /// + /// Gets the custom format specifier that may be used to represent a in the RFC 822 format. + /// + /// A DateTime format string that may be used to represent a in the RFC 822 format. + /// + /// + /// This method returns a string representation of a that utilizes the time zone + /// offset (local differential) to represent the offset from Greenwich mean time in hours and minutes. + /// The is a valid date-time format string for use + /// in the method. + /// + /// + /// The RFC 822 Date and Time specification + /// specifies that the year will be represented as a two-digit value, but the + /// RSS Profile recommends that + /// all date-time values should use a four-digit year. The class + /// follows the RSS Profile recommendation when converting a to the equivalent + /// RFC 822 string representation. + /// + /// + public static string Rfc822DateTimeFormat + { + get + { + return format; + } + } + #endregion + + #region Rfc822DateTimePatterns + /// + /// Gets an array of the expected formats for RFC 822 date-time string representations. + /// + /// + /// An array of the expected formats for RFC 822 date-time string representations + /// that may used in the method. + /// + /// + /// The array of the expected formats that is returned assumes that the RFC 822 time zone + /// is represented as or converted to a local differential representation. + /// + /// + public static string[] Rfc822DateTimePatterns + { + get + { + if (formats.Length > 0) + { + return formats; + } + else + { + formats = new string[35]; + + // two-digit day, four-digit year patterns + formats[0] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffffff zzzz"; + formats[1] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffffff zzzz"; + formats[2] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fffff zzzz"; + formats[3] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ffff zzzz"; + formats[4] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'fff zzzz"; + formats[5] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'ff zzzz"; + formats[6] = "ddd',' dd MMM yyyy HH':'mm':'ss'.'f zzzz"; + formats[7] = "ddd',' dd MMM yyyy HH':'mm':'ss zzzz"; + + // two-digit day, two-digit year patterns + formats[8] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffffff zzzz"; + formats[9] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffffff zzzz"; + formats[10] = "ddd',' dd MMM yy HH':'mm':'ss'.'fffff zzzz"; + formats[11] = "ddd',' dd MMM yy HH':'mm':'ss'.'ffff zzzz"; + formats[12] = "ddd',' dd MMM yy HH':'mm':'ss'.'fff zzzz"; + formats[13] = "ddd',' dd MMM yy HH':'mm':'ss'.'ff zzzz"; + formats[14] = "ddd',' dd MMM yy HH':'mm':'ss'.'f zzzz"; + formats[15] = "ddd',' dd MMM yy HH':'mm':'ss zzzz"; + + // one-digit day, four-digit year patterns + formats[16] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffffff zzzz"; + formats[17] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffffff zzzz"; + formats[18] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fffff zzzz"; + formats[19] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ffff zzzz"; + formats[20] = "ddd',' d MMM yyyy HH':'mm':'ss'.'fff zzzz"; + formats[21] = "ddd',' d MMM yyyy HH':'mm':'ss'.'ff zzzz"; + formats[22] = "ddd',' d MMM yyyy HH':'mm':'ss'.'f zzzz"; + formats[23] = "ddd',' d MMM yyyy HH':'mm':'ss zzzz"; + + // two-digit day, two-digit year patterns + formats[24] = "ddd',' d MMM yy HH':'mm':'ss'.'fffffff zzzz"; + formats[25] = "ddd',' d MMM yy HH':'mm':'ss'.'ffffff zzzz"; + formats[26] = "ddd',' d MMM yy HH':'mm':'ss'.'fffff zzzz"; + formats[27] = "ddd',' d MMM yy HH':'mm':'ss'.'ffff zzzz"; + formats[28] = "ddd',' d MMM yy HH':'mm':'ss'.'fff zzzz"; + formats[29] = "ddd',' d MMM yy HH':'mm':'ss'.'ff zzzz"; + formats[30] = "ddd',' d MMM yy HH':'mm':'ss'.'f zzzz"; + formats[31] = "ddd',' d MMM yy HH':'mm':'ss zzzz"; + + // Fall back patterns + formats[32] = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK"; // RoundtripDateTimePattern + formats[33] = DateTimeFormatInfo.InvariantInfo.UniversalSortableDateTimePattern; + formats[34] = DateTimeFormatInfo.InvariantInfo.SortableDateTimePattern; + + return formats; + } + } + } + #endregion + + //============================================================ + // Public Methods + //============================================================ + #region Parse(string s) + /// + /// Converts the specified string representation of a date and time to its equivalent. + /// + /// A string containing a date and time to convert. + /// + /// A equivalent to the date and time contained in , + /// expressed as Coordinated Universal Time (UTC). + /// + /// + /// The string is parsed using formatting information in the object. + /// + /// is a null reference (Nothing in Visual Basic). + /// is an empty string. + /// does not contain a valid RFC 822 string representation of a date and time. + public static DateTime Parse(string s) + { + DateTime result; + if (Rfc822DateTime.TryParse(s, out result)) + { + return result; + } + else + { + throw new FormatException(String.Format(null, "{0} is not a valid RFC 822 string representation of a date and time.", s)); + } + } + #endregion + + #region ConvertZoneToLocalDifferential(string s) + /// + /// Converts the time zone component of an RFC 822 date and time string representation to its local differential (time zone offset). + /// + /// A string containing an RFC 822 date and time to convert. + /// A date and time string that uses local differential to describe the time zone equivalent to the date and time contained in . + /// is a null reference (Nothing in Visual Basic). + /// is an empty string. + public static string ConvertZoneToLocalDifferential(string s) + { + string zoneRepresentedAsLocalDifferential = String.Empty; + + + if (s.EndsWith(" UT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" UT") + 1)), "+00:00"); + } + else if (s.EndsWith(" GMT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" GMT") + 1)), "+00:00"); + } + else if (s.EndsWith(" EST", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EST") + 1)), "-05:00"); + } + else if (s.EndsWith(" EDT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" EDT") + 1)), "-04:00"); + } + else if (s.EndsWith(" CST", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CST") + 1)), "-06:00"); + } + else if (s.EndsWith(" CDT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" CDT") + 1)), "-05:00"); + } + else if (s.EndsWith(" MST", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MST") + 1)), "-07:00"); + } + else if (s.EndsWith(" MDT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" MDT") + 1)), "-06:00"); + } + else if (s.EndsWith(" PST", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PST") + 1)), "-08:00"); + } + else if (s.EndsWith(" PDT", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" PDT") + 1)), "-07:00"); + } + else if (s.EndsWith(" Z", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Z") + 1)), "+00:00"); + } + else if (s.EndsWith(" A", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" A") + 1)), "-01:00"); + } + else if (s.EndsWith(" M", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" M") + 1)), "-12:00"); + } + else if (s.EndsWith(" N", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" N") + 1)), "+01:00"); + } + else if (s.EndsWith(" Y", StringComparison.OrdinalIgnoreCase)) + { + zoneRepresentedAsLocalDifferential = String.Concat(s.Substring(0, (s.LastIndexOf(" Y") + 1)), "+12:00"); + } + else + { + zoneRepresentedAsLocalDifferential = s; + } + + return zoneRepresentedAsLocalDifferential; + } + #endregion + + #region ToString(DateTime utcDateTime) + /// + /// Converts the value of the specified object to its equivalent string representation. + /// + /// The Coordinated Universal Time (UTC) to convert. + /// A RFC 822 string representation of the value of the . + /// The specified object does not represent a Coordinated Universal Time (UTC) value. + public static string ToString(DateTime utcDateTime) + { + if (utcDateTime.Kind != DateTimeKind.Utc) + { + throw new ArgumentException("utcDateTime"); + } + + return utcDateTime.ToString(Rfc822DateTime.Rfc822DateTimeFormat, DateTimeFormatInfo.InvariantInfo); + } + #endregion + + #region TryParse(string s, out DateTime result) + /// + /// Converts the specified string representation of a date and time to its equivalent. + /// + /// A string containing a date and time to convert. + /// + /// When this method returns, contains the value equivalent to the date and time + /// contained in , expressed as Coordinated Universal Time (UTC), + /// if the conversion succeeded, or MinValue if the conversion failed. + /// The conversion fails if the s parameter is a null reference (Nothing in Visual Basic), + /// or does not contain a valid string representation of a date and time. + /// This parameter is passed uninitialized. + /// + /// true if the parameter was converted successfully; otherwise, false. + /// + /// The string is parsed using formatting information in the object. + /// + public static bool TryParse(string s, out DateTime result) + { + //------------------------------------------------------------ + // Attempt to convert string representation + //------------------------------------------------------------ + bool wasConverted = false; + result = DateTime.MinValue; + + if (!String.IsNullOrEmpty(s)) + { + DateTime parseResult; + if (DateTime.TryParseExact(Rfc822DateTime.ConvertZoneToLocalDifferential(s), Rfc822DateTime.Rfc822DateTimePatterns, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AdjustToUniversal, out parseResult)) + { + result = DateTime.SpecifyKind(parseResult, DateTimeKind.Utc); + wasConverted = true; + } + } + + return wasConverted; + } + #endregion + } +} \ No newline at end of file diff --git a/Growl Extras/Growl Display SDK/libraries/Growl.CoreLibrary.dll b/Growl Extras/Growl Display SDK/libraries/Growl.CoreLibrary.dll index 16059a486a2d1eb97a5de2cbf4e2f90e9982b7d1..b5d0f83a463b8dab743057c05159b94f32a2afc7 100644 GIT binary patch delta 230 zcmV!cj7g`dTjaL}W!b-0 ztK}vKad-~Q0C#Iq!TEM&&!pGgQV!m{<9$*q0Gsxhbx*8$9AMvA1J*Ot^wi_aVv`d? zGWhu;zbg<@dc|VoK_Wl`$A8w(@gu9%rX(T>t<8 delta 230 zcmV4Hu|1hDz7 zpH(DuUN!}t!$huk9~4vVs18_4u+O*V{w!cij_qSqpSsuSwkJ&r3k|O(3O>8y7lV75 zS13k44(1^3NE?xxzGLsWD#RDzl%#+(R84xuZzA*C1 g_C%a7jumK7xe&7iHHZrV7PE~&Z29yzsXwEzGB diff --git a/Growl Extras/Growl Display SDK/libraries/Growl.DisplayStyle.dll b/Growl Extras/Growl Display SDK/libraries/Growl.DisplayStyle.dll index eaac91061a667cca27bfcc7e1b29e6051e2de2de..f80e0386a54fdc03d80f9d78ec79ca08bb0ebcc4 100644 GIT binary patch delta 430 zcmZo@U~Xt&p3uR3&hP!k?peBwT$9!G0)b?O-UlF=sh`8hwfUOAS-p@3DNV%m)}}lw%`MS2R$Kj*=|HLI%^xo>9u$VM+x+HN{G094ndY zl-fC7GPEo8aa1z1DONL8GGA1vW?INFNoguaA@khL)1$gHH*2&+F|s9PmgFWDY;J5- zW)pZOn!3MsZ?pSsw+TI(ul3nBZ|RO>28NMve*_z&$>f}=Cv4gi-seDweT delta 429 zcmZo@U~Xt&p3uRp_xQ}l?peBwMw8X_0)b?O-UlF=sh`7WwE3F;bS9=3%#-ttGJs+? zjGBRBF~(AiK&sq?i;`~-k5@YzHcw147 zK}4xhP>ewXOuB-}05DmyIn(Aj3uEBsKu1F%wQxlS1}27DVFm_fhBht+1{Q`6Aj!%Q z2^42!h?fP)1}JV`5gfth*`lb)(aBuEs>AS-p@3DNV%*Pe&ITkY9QCPq} zk@=#cD^Q$C$qz{Ch#q2I$RMQ@%CQlsD;lWASV@*)A%o3i&nRW>Sfv7>nkuC-j+M-< zO6?pk8Typ^I4YUh6swsknJ+3-Gc9D8sWg?Nka@}G=}}#pteGXbi3OYGTVfbDH?=CU z39Nf^?Z@QWLhse_&gQ8_wx>65>5gLt29a=o1RF5ea;Bcp0S2-c0}wC)aV`-1ECb?c t3=BcRF2Ui-F|&)eJ@jwje(hkp`cwDjglRfljAEO67Zid5`u{>kIRFq2d~5&! diff --git a/Growl Extras/Growl ITunes Plugin/Growl ITunes Plugin/GrowlPlugin.cs b/Growl Extras/Growl ITunes Plugin/Growl ITunes Plugin/GrowlPlugin.cs index e54cff0..3b54d75 100644 --- a/Growl Extras/Growl ITunes Plugin/Growl ITunes Plugin/GrowlPlugin.cs +++ b/Growl Extras/Growl ITunes Plugin/Growl ITunes Plugin/GrowlPlugin.cs @@ -134,9 +134,7 @@ void Notify(object iTrack) int databaseID; song.GetITObjectIDs(out sourceID, out playlistID, out trackID, out databaseID); - Growl.Connector.CallbackContext callback = new Growl.Connector.CallbackContext(); - callback.Type = "song"; - callback.Data = String.Format("{0}|{1}|{2}|{3}", sourceID, playlistID, trackID, databaseID); + Growl.Connector.CallbackContext callback = new Growl.Connector.CallbackContext("song", String.Format("{0}|{1}|{2}|{3}", sourceID, playlistID, trackID, databaseID)); //Growl.CoreLibrary.Resource albumIcon = artworkFilePath; Growl.CoreLibrary.Resource albumIcon = (artworkData != null ? new Growl.CoreLibrary.BinaryData(artworkData) : null); diff --git a/Growl Extras/Growl Outlook Add-In/GrowlExtras.OutlookAddIn/ThisApplication.cs b/Growl Extras/Growl Outlook Add-In/GrowlExtras.OutlookAddIn/ThisApplication.cs index 2d80d1f..6a01b10 100644 --- a/Growl Extras/Growl Outlook Add-In/GrowlExtras.OutlookAddIn/ThisApplication.cs +++ b/Growl Extras/Growl Outlook Add-In/GrowlExtras.OutlookAddIn/ThisApplication.cs @@ -77,6 +77,11 @@ void ThisApplication_NewMailEx(string EntryIDCollection) string body = message.Body.Replace("\r\n", "\n"); body = (body.Length > 50 ? body.Substring(0, 50) + "..." : body); + // just saving this for future reference + //Outlook.MAPIFolder folder = message.Parent as Outlook.MAPIFolder; + //Outlook.NameSpace outlookNameSpace = this.GetNamespace("MAPI"); + //Outlook.MAPIFolder junkFolder = outlookNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders..olFolderJunk); + title = message.Subject; if (!String.IsNullOrEmpty(title)) title = title.Trim(); title = (String.IsNullOrEmpty(title) ? "[No Subject]" : message.Subject); diff --git a/Growl Extras/Growl Outlook Add-In/GrowlOutlookAddInSetup/GrowlOutlookAddInSetup b/Growl Extras/Growl Outlook Add-In/GrowlOutlookAddInSetup/GrowlOutlookAddInSetup index 44f19e2..186b5be 100644 --- a/Growl Extras/Growl Outlook Add-In/GrowlOutlookAddInSetup/GrowlOutlookAddInSetup +++ b/Growl Extras/Growl Outlook Add-In/GrowlOutlookAddInSetup/GrowlOutlookAddInSetup @@ -588,14 +588,14 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Growl Outlook Add-In" - "ProductCode" = "8:{B983A19F-DA56-40CE-86CE-047D599821D1}" - "PackageCode" = "8:{0E11437B-3562-4892-8C8A-DA963ECAD02E}" + "ProductCode" = "8:{0A05FD1F-F708-427B-AEB5-12E4FBD11F53}" + "PackageCode" = "8:{1E02761D-BF46-4F66-A266-658AAFED77C0}" "UpgradeCode" = "8:{49A7FB61-9235-4718-B57C-A8C2DB8C84C8}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:FALSE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.0.4" + "ProductVersion" = "8:1.0.5" "Manufacturer" = "8:Growl Extras" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/Growl Extras/Growl Visual Studio Add-In/Deployment/Deployment.vdproj b/Growl Extras/Growl Visual Studio Add-In/Deployment/Deployment.vdproj index cf52208..e6b36d6 100644 --- a/Growl Extras/Growl Visual Studio Add-In/Deployment/Deployment.vdproj +++ b/Growl Extras/Growl Visual Studio Add-In/Deployment/Deployment.vdproj @@ -247,7 +247,7 @@ { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=x86" + "AssemblyAsmDisplayName" = "8:Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=MSIL" "ScatterAssemblies" { "_2A3D301AE43B4562686ECF2B7D48C150" @@ -420,7 +420,7 @@ { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=x86" + "AssemblyAsmDisplayName" = "8:Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=MSIL" "ScatterAssemblies" { "_E6C013D54794CC24E6A5582343AF2461" @@ -577,14 +577,14 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Growl Add-In for Visual Studio" - "ProductCode" = "8:{21327019-EE79-4052-9F4D-AE24F6E68BAF}" - "PackageCode" = "8:{85D78094-C9EA-4EF0-81DB-0713A0AD5ED3}" + "ProductCode" = "8:{BB29F808-40C0-4886-9AB9-393D73628676}" + "PackageCode" = "8:{C5E155D7-72FB-4A43-9C77-7470469897C3}" "UpgradeCode" = "8:{F831506E-1E2C-4B2E-B02A-EAB81096EF29}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.2" + "ProductVersion" = "8:1.0.3" "Manufacturer" = "8:Growl Extras" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/Growl Extras/IPhone Style Display/IphoneWindow.cs b/Growl Extras/IPhone Style Display/IphoneWindow.cs index 91962cf..c7a07f3 100644 --- a/Growl Extras/IPhone Style Display/IphoneWindow.cs +++ b/Growl Extras/IPhone Style Display/IphoneWindow.cs @@ -194,7 +194,7 @@ protected override void OnShown(EventArgs e) void IphoneWindow_AutoClosing(object sender, FormClosingEventArgs e) { this.fadeOutTimer = new Timer(); - this.fadeOutTimer.Interval = 50; + this.fadeOutTimer.Interval = 10; this.fadeOutTimer.Tick += new EventHandler(fadeOutTimer_Tick); this.fadeOutTimer.Start(); e.Cancel = true; // IMPORTANT! diff --git a/Growl Extras/NotifyDisplay/NotifyDisplay/NotifyWindow.cs b/Growl Extras/NotifyDisplay/NotifyDisplay/NotifyWindow.cs index 9fe8e09..f848d5d 100644 --- a/Growl Extras/NotifyDisplay/NotifyDisplay/NotifyWindow.cs +++ b/Growl Extras/NotifyDisplay/NotifyDisplay/NotifyWindow.cs @@ -116,7 +116,7 @@ private System.Drawing.Bitmap SizeImage(System.Drawing.Bitmap originalImage, int { int minHeight = 80; int topHeight = 30; - int bottomHeight = 20; + int bottomHeight = 19; if (newHeight < minHeight) newHeight = minHeight; @@ -172,7 +172,7 @@ protected override void OnShown(EventArgs e) void NotifyWindow_AutoClosing(object sender, FormClosingEventArgs e) { this.fadeOutTimer = new Timer(); - this.fadeOutTimer.Interval = 50; + this.fadeOutTimer.Interval = 10; this.fadeOutTimer.Tick += new EventHandler(fadeOutTimer_Tick); this.fadeOutTimer.Start(); e.Cancel = true; // IMPORTANT! @@ -206,7 +206,8 @@ private void titleLabel_LabelHeightChanged(ExpandingLabel.LabelHeightChangedEven { if (args.HeightChange != 0) { - this.textLabel.Top += args.HeightChange; + int fudge = 2; + this.textLabel.Top += (args.HeightChange + fudge); textLabel_LabelHeightChanged(args); } } @@ -215,7 +216,9 @@ private void textLabel_LabelHeightChanged(ExpandingLabel.LabelHeightChangedEvent { if (args.HeightChange != 0) { - this.Height += args.HeightChange; + int fudge = 2; + this.textLabel.Height += fudge; + this.Height += (args.HeightChange + fudge); } } } diff --git a/Growl Extras/Sticky Note/Sticky Note/StickyNoteWindow.cs b/Growl Extras/Sticky Note/Sticky Note/StickyNoteWindow.cs index be76d3b..aed4428 100644 --- a/Growl Extras/Sticky Note/Sticky Note/StickyNoteWindow.cs +++ b/Growl Extras/Sticky Note/Sticky Note/StickyNoteWindow.cs @@ -173,7 +173,7 @@ protected override void OnShown(EventArgs e) void StickyNoteWindow_AutoClosing(object sender, FormClosingEventArgs e) { this.fadeOutTimer = new Timer(); - this.fadeOutTimer.Interval = 50; + this.fadeOutTimer.Interval = 10; this.fadeOutTimer.Tick += new EventHandler(fadeOutTimer_Tick); this.fadeOutTimer.Start(); e.Cancel = true; // IMPORTANT! diff --git a/Growl/Growl.Connector/CallbackContext.cs b/Growl/Growl.Connector/CallbackContext.cs index 9f73536..dac72f3 100644 --- a/Growl/Growl.Connector/CallbackContext.cs +++ b/Growl/Growl.Connector/CallbackContext.cs @@ -9,21 +9,41 @@ namespace Growl.Connector /// public class CallbackContext : CallbackDataBase { + /// + /// The callback url + /// private string url; + /// + /// Initializes a new instance of the class. + /// + /// The data. + /// The type. public CallbackContext(string data, string type) : base(data, type) { } + /// + /// Initializes a new instance of the class, + /// specifying a callback url. + /// + /// The URL. public CallbackContext(string url) { this.url = url; } + /// + /// Initializes a new instance of the class. + /// private CallbackContext() { } + /// + /// Gets the callback URL. + /// + /// The callback URL. public string CallbackUrl { get diff --git a/Growl/Growl.Connector/CallbackData.cs b/Growl/Growl.Connector/CallbackData.cs index 8fe4ecd..c371c48 100644 --- a/Growl/Growl.Connector/CallbackData.cs +++ b/Growl/Growl.Connector/CallbackData.cs @@ -21,6 +21,13 @@ public class CallbackData : CallbackDataBase /// private string notificationID; + /// + /// Initializes a new instance of the class. + /// + /// The data. + /// The type. + /// The result. + /// The notification ID. public CallbackData(string data, string type, CallbackResult result, string notificationID) : base(data, type) { diff --git a/Growl/Growl.Connector/ConnectorBase.cs b/Growl/Growl.Connector/ConnectorBase.cs index b905ef9..7fd1771 100644 --- a/Growl/Growl.Connector/ConnectorBase.cs +++ b/Growl/Growl.Connector/ConnectorBase.cs @@ -228,6 +228,7 @@ protected void Send(MessageBuilder mb, ResponseReceivedEventHandler del, bool wa { TcpClient client = new TcpClient(); byte[] bytes = mb.GetBytes(); + mb = null; AsyncCallback callback = new AsyncCallback(ConnectCallback); state = new ConnectState(client, bytes, del, waitForCallback); @@ -326,7 +327,7 @@ private void ReadCallback(IAsyncResult iar) state.Response += response; // keep waiting for more data if this wasnt the end of the message - if (!state.Response.EndsWith(EOM)) + if (!state.Response.EndsWith(EOM, StringComparison.InvariantCulture)) { moreData = true; AsyncCallback callback = new AsyncCallback(ReadCallback); diff --git a/Growl/Growl.Connector/Cryptography.cs b/Growl/Growl.Connector/Cryptography.cs index 83c2db6..261699d 100644 --- a/Growl/Growl.Connector/Cryptography.cs +++ b/Growl/Growl.Connector/Cryptography.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Security.Cryptography; using System.Text; @@ -22,6 +23,16 @@ public sealed class Cryptography /// private static RandomNumberGenerator rng = RNGCryptoServiceProvider.Create(); + /// + /// A list of all of the supported hash types + /// + private static Dictionary hashTypes; + + /// + /// A list of all of the supported encryption algorithms + /// + private static Dictionary encryptionTypes; + # endregion member variables & constants # region constructors @@ -32,6 +43,25 @@ public sealed class Cryptography /// private Cryptography() { } + + /// + /// Initializes the class. + /// + static Cryptography() + { + hashTypes = new Dictionary(); + foreach (Cryptography.HashAlgorithmType type in Enum.GetValues(typeof(Cryptography.HashAlgorithmType))) + { + hashTypes.Add(DisplayName.Fetch(type), type); + } + + encryptionTypes = new Dictionary(); + foreach (Cryptography.SymmetricAlgorithmType type in Enum.GetValues(typeof(Cryptography.SymmetricAlgorithmType))) + { + encryptionTypes.Add(DisplayName.Fetch(type), type); + } + } + # endregion constructors # region Public Methods @@ -351,6 +381,7 @@ public static byte[] Decrypt(byte[] key, byte[] iv, byte[] encryptedBytes, Symme // decrypt ICryptoTransform decryptor = algorithm.CreateDecryptor(); + byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); return decryptedBytes; } @@ -432,6 +463,32 @@ public static byte[] HexUnencode(string hexString) return bytes; } + /// + /// Looks up the hash algorithm by name + /// + /// The name of the hash type + /// + public static Cryptography.HashAlgorithmType GetKeyHashType(string name) + { + if (!String.IsNullOrEmpty(name) && hashTypes.ContainsKey(name)) + return hashTypes[name]; + else + throw new CryptographicException(String.Format("No matching hash type found for name '{0}'.", name)); + } + + /// + /// Looks up the encryption algorithm by name + /// + /// The name of the encryption algorithm + /// + public static Cryptography.SymmetricAlgorithmType GetEncryptionType(string name) + { + if (encryptionTypes.ContainsKey(name)) + return encryptionTypes[name]; + else + throw new CryptographicException(String.Format("No matching encryption algorithm found for name '{0}'.", name)); + } + # endregion Public Methods # region Private Methods @@ -520,7 +577,7 @@ public enum SymmetricAlgorithmType [DisplayName("DES")] DES, /// - /// TripleDES Encryption (128-bit key, 64-bit IV) + /// TripleDES Encryption (192-bit key, 64-bit IV) /// [DisplayName("3DES")] TripleDES, diff --git a/Growl/Growl.Connector/Growl.Connector.csproj b/Growl/Growl.Connector/Growl.Connector.csproj index 557b548..f19d893 100644 --- a/Growl/Growl.Connector/Growl.Connector.csproj +++ b/Growl/Growl.Connector/Growl.Connector.csproj @@ -45,10 +45,8 @@ - - diff --git a/Growl/Growl.Connector/GrowlException.cs b/Growl/Growl.Connector/GrowlException.cs index 6e89c39..c10a378 100644 --- a/Growl/Growl.Connector/GrowlException.cs +++ b/Growl/Growl.Connector/GrowlException.cs @@ -8,7 +8,7 @@ namespace Growl.Connector /// The base exception type for any exceptions thrown from Growl code. /// [Serializable] - public class GrowlException : ApplicationException + public class GrowlException : Exception { /// /// The of the exception diff --git a/Growl/Growl.Connector/Header.cs b/Growl/Growl.Connector/Header.cs index a54f979..5243ca1 100644 --- a/Growl/Growl.Connector/Header.cs +++ b/Growl/Growl.Connector/Header.cs @@ -163,7 +163,7 @@ private void Initialize(string name, string val) if (name == null && val == null) this.isBlankLine = true; if (!this.isBlankLine) { - if (val != null && val.StartsWith(GROWL_RESOURCE_POINTER_PREFIX)) + if (val != null && val.StartsWith(GROWL_RESOURCE_POINTER_PREFIX, StringComparison.InvariantCultureIgnoreCase)) { this.isGrowlResourcePointer = true; this.growlResourcePointerID = val.Replace(GROWL_RESOURCE_POINTER_PREFIX, ""); diff --git a/Growl/Growl.Connector/Key.cs b/Growl/Growl.Connector/Key.cs index 1032c42..fafa9df 100644 --- a/Growl/Growl.Connector/Key.cs +++ b/Growl/Growl.Connector/Key.cs @@ -69,7 +69,10 @@ protected Key(string password, Cryptography.HashAlgorithmType hashAlgorithm, Cry this.hashAlgorithm = hashAlgorithm; this.encryptionAlgorithm = encryptionAlgorithm; - byte[] saltBytes = Cryptography.GenerateBytes(8); +// byte[] saltBytes = Cryptography.GenerateBytes(8); +// this.salt = Cryptography.HexEncode(saltBytes); + + byte[] saltBytes = Growl.Connector.Cryptography.HexUnencode("bbdf0d5db70ab6f0bf6a18b804a4c3c0"); this.salt = Cryptography.HexEncode(saltBytes); byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password); diff --git a/Growl/Growl.Connector/MessageBuilder.cs b/Growl/Growl.Connector/MessageBuilder.cs index c3b0f81..1d5fae5 100644 --- a/Growl/Growl.Connector/MessageBuilder.cs +++ b/Growl/Growl.Connector/MessageBuilder.cs @@ -249,8 +249,12 @@ public void AddHeader(Header header) /// The value of the header protected void AddHeader(string name, string val) { - string s = String.Format(HEADER_FORMAT, name, val); - this.bytes.AddRange(GetStringBytes(s)); + if (!String.IsNullOrEmpty(name)) + { + if (!String.IsNullOrEmpty(val)) val = val.Replace("\r", ""); // remove any \r characters + string s = String.Format(HEADER_FORMAT, name, val); + this.bytes.AddRange(GetStringBytes(s)); + } } /// diff --git a/Growl/Growl.Connector/MessageParser.cs b/Growl/Growl.Connector/MessageParser.cs index f9f486f..78729eb 100644 --- a/Growl/Growl.Connector/MessageParser.cs +++ b/Growl/Growl.Connector/MessageParser.cs @@ -96,7 +96,7 @@ private Response Parse(string message, out HeaderCollection headers) { this.version = match.Groups["Version"].Value; this.directive = match.Groups["Directive"].Value; - if (this.directive.StartsWith("-")) this.directive = this.directive.Remove(0, 1); + if (this.directive.StartsWith("-", StringComparison.InvariantCulture)) this.directive = this.directive.Remove(0, 1); if (version == GNTP_SUPPORTED_VERSION) { diff --git a/Growl/Growl.Connector/NotificationType.cs b/Growl/Growl.Connector/NotificationType.cs index 7b052f1..14db846 100644 --- a/Growl/Growl.Connector/NotificationType.cs +++ b/Growl/Growl.Connector/NotificationType.cs @@ -11,22 +11,22 @@ public class NotificationType : ExtensibleObject /// /// The name of the notification type /// - protected string name = "Undefined Notification"; + private string name = "Undefined Notification"; /// /// The display name of the notification type /// - protected string displayName = null; + private string displayName = null; /// /// The default icon for notifications of this type /// - protected Resource icon; + private Resource icon; /// /// Indicates if this type of notification should be enabled or disabled by default /// - protected bool enabled = true; + private bool enabled = true; /// /// Creates a instance of the class. diff --git a/Growl/Growl.Connector/Properties/AssemblyInfo.cs b/Growl/Growl.Connector/Properties/AssemblyInfo.cs index 8619699..5094106 100644 --- a/Growl/Growl.Connector/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Connector/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.CoreLibrary/Growl.CoreLibrary.csproj b/Growl/Growl.CoreLibrary/Growl.CoreLibrary.csproj index ce67ce4..6b35c36 100644 --- a/Growl/Growl.CoreLibrary/Growl.CoreLibrary.csproj +++ b/Growl/Growl.CoreLibrary/Growl.CoreLibrary.csproj @@ -45,9 +45,7 @@ - - diff --git a/Growl/Growl.CoreLibrary/Properties/AssemblyInfo.cs b/Growl/Growl.CoreLibrary/Properties/AssemblyInfo.cs index adf8e0f..52c8bec 100644 --- a/Growl/Growl.CoreLibrary/Properties/AssemblyInfo.cs +++ b/Growl/Growl.CoreLibrary/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Daemon/AsyncSocket.cs b/Growl/Growl.Daemon/AsyncSocket.cs index ab657a8..0ec15b5 100644 --- a/Growl/Growl.Daemon/AsyncSocket.cs +++ b/Growl/Growl.Daemon/AsyncSocket.cs @@ -1753,6 +1753,13 @@ private void Close(object ignore) // The readTimer and writeTimer are cleared in the EmptyQueues method above. + // Clear flags to signal closed socket + flags = (kForbidReadsWrites | kClosed); + + // Notify delegate that we're now disconnected + OnSocketDidClose(); + + /* GFW - change to always call OnSocketDidClose if ((flags & kDidPassConnectMethod) > 0) { // Clear flags to signal closed socket @@ -1766,6 +1773,7 @@ private void Close(object ignore) // Clear flags to signal closed socket flags = (kForbidReadsWrites | kClosed); } + * */ } } @@ -1822,6 +1830,11 @@ public void CloseAfterReadingAndWriting() ThreadPool.QueueUserWorkItem(new WaitCallback(MaybeClose)); } + public void CloseImmediately() + { + Close(null); + } + private void MaybeClose(object ignore) { lock (lockObj) diff --git a/Growl/Growl.Daemon/BonjourService.cs b/Growl/Growl.Daemon/BonjourService.cs index ac7fc70..b0f4f28 100644 --- a/Growl/Growl.Daemon/BonjourService.cs +++ b/Growl/Growl.Daemon/BonjourService.cs @@ -98,6 +98,7 @@ internal void Start(int port) } catch(Exception ex) { + System.Diagnostics.Debug.WriteLine(String.Format("Bonjour service not published - {0}", ex.Message)); this.isStarted = false; } } @@ -170,12 +171,19 @@ private Mono.Zeroconf.RegisterService Publish(string domain, string type, string #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.Daemon/Growl.Daemon.csproj b/Growl/Growl.Daemon/Growl.Daemon.csproj index 95bc7c0..bd81b09 100644 --- a/Growl/Growl.Daemon/Growl.Daemon.csproj +++ b/Growl/Growl.Daemon/Growl.Daemon.csproj @@ -45,11 +45,9 @@ - - diff --git a/Growl/Growl.Daemon/GrowlServer.cs b/Growl/Growl.Daemon/GrowlServer.cs index ed50a11..65762e2 100644 --- a/Growl/Growl.Daemon/GrowlServer.cs +++ b/Growl/Growl.Daemon/GrowlServer.cs @@ -195,7 +195,8 @@ public class GrowlServer : IDisposable /// The full path to the user folder where logs, resource cache, and other files will be stored. public GrowlServer(int port, PasswordManager passwordManager, string userFolder) { - ExtensibleObject.SetSoftwareInformation(serverName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); + // this will set the server name and version properly + ServerName = serverName; this.port = (ushort) port; @@ -252,8 +253,11 @@ public string ServerName } set { + System.Diagnostics.FileVersionInfo f = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location); + string version = f.FileVersion; + this.serverName = value; - ExtensibleObject.SetSoftwareInformation(this.serverName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); + ExtensibleObject.SetSoftwareInformation(this.serverName, version); } } @@ -414,15 +418,27 @@ public void Stop() this.socketCleanupTimer.Stop(); // Stop any client connections + int connected = 0; while(connectedSockets.Count > 0) { + // if this happens, then the socket could not be closed properly for some reason. + // we have no choice but to abandon the routine and force the stop anyway. + // (hopefully, dangling sockets will get cleaned up later by the GC) + if (connectedSockets.Count == connected) + { + this.connectedSockets.Clear(); + this.connectedHandlers.Clear(); + break; + } + connected = connectedSockets.Count; + // Call Disconnect on the socket, // which will invoke the DidDisconnect method, // which will remove the socket and handler from the list. // (we have to use some trickery to a single item from the list without knowing the key) AsyncSocket someSocket = connectedSockets[0].Socket; - if(someSocket != null) someSocket.Close(); + if(someSocket != null) someSocket.CloseImmediately(); } if(this.bonjour != null) this.bonjour.Stop(); @@ -702,7 +718,12 @@ private void AddServerHeaders(ExtensibleObject exObj) exObj.CustomTextAttributes.Add("Timestamp", DateTime.Now.ToString()); } - // TODO: + + /// + /// Adds any application-specific headers to the message + /// + /// The used to construct the message + /// The that contains the application-specific data private void AddRequestData(MessageBuilder mb, RequestData requestData) { if (requestData != null) @@ -826,12 +847,19 @@ public enum LogMessageType #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.Daemon/MessageHandler.cs b/Growl/Growl.Daemon/MessageHandler.cs index e05ebec..2825460 100644 --- a/Growl/Growl.Daemon/MessageHandler.cs +++ b/Growl/Growl.Daemon/MessageHandler.cs @@ -62,15 +62,6 @@ public class MessageHandler /// private static Regex regExMessageHeader_Remote = new Regex(@"GNTP/(?.\..)\s+(?\S+)\s+(((?\S+):(?\S+))\s+|((?\S+)\s+))(?(\S+)):(?(\S+))\.(?(\S+))\s*[\r\n]"); - /// - /// A list of all of the hash types supported by this server - /// - private static Dictionary hashTypes; - - /// - /// A list of all of the encryption algorithms supported by this server. - /// - private static Dictionary encryptionTypes; private const long ACCEPT_TAG = 0; private const long FLASH_POLICY_REQUEST_TAG = 1; @@ -285,17 +276,7 @@ public class MessageHandler /// static MessageHandler() { - hashTypes = new Dictionary(); - foreach (Cryptography.HashAlgorithmType type in Enum.GetValues(typeof(Cryptography.HashAlgorithmType))) - { - hashTypes.Add(DisplayName.Fetch(type), type); - } - - encryptionTypes = new Dictionary(); - foreach (Cryptography.SymmetricAlgorithmType type in Enum.GetValues(typeof(Cryptography.SymmetricAlgorithmType))) - { - encryptionTypes.Add(DisplayName.Fetch(type), type); - } + // we dont do anything here anymore, but lets keep it around for now... } /// @@ -553,7 +534,7 @@ public void SocketDidRead(AsyncSocket socket, byte[] readBytes, long tag) } else { - this.encryptionAlgorithm = GetEncryptionType(match.Groups["EncryptionAlgorithm"].Value); + this.encryptionAlgorithm = Cryptography.GetEncryptionType(match.Groups["EncryptionAlgorithm"].Value); this.ivHex = (match.Groups["IV"] != null ? match.Groups["IV"].Value : null); if (!String.IsNullOrEmpty(this.ivHex)) this.iv = Cryptography.HexUnencode(this.ivHex); string keyHash = match.Groups["KeyHash"].Value.ToUpper(); @@ -575,7 +556,7 @@ public void SocketDidRead(AsyncSocket socket, byte[] readBytes, long tag) else { string keyHashAlgorithmType = match.Groups["KeyHashAlgorithm"].Value; - this.keyHashAlgorithm = GetKeyHashType(keyHashAlgorithmType); + this.keyHashAlgorithm = Cryptography.GetKeyHashType(keyHashAlgorithmType); string salt = match.Groups["Salt"].Value.ToUpper(); authorized = this.passwordManager.IsValid(keyHash, salt, this.keyHashAlgorithm, this.encryptionAlgorithm, out this.key); } @@ -1162,32 +1143,6 @@ private bool CheckAlreadyProcessed() return false; } - /// - /// Gets the type of hash algorithm used in the request. - /// - /// The name of the hash type - /// - private static Cryptography.HashAlgorithmType GetKeyHashType(string name) - { - if (!String.IsNullOrEmpty(name) && hashTypes.ContainsKey(name)) - return hashTypes[name]; - else - throw new GrowlException(ErrorCode.INVALID_REQUEST, ErrorDescription.UNSUPPORTED_HASH_ALGORITHM, name); - } - - /// - /// Gets the type of encryption algorithm used in the request. - /// - /// The name of the encryption algorithm - /// - private static Cryptography.SymmetricAlgorithmType GetEncryptionType(string name) - { - if (encryptionTypes.ContainsKey(name)) - return encryptionTypes[name]; - else - throw new GrowlException(ErrorCode.INVALID_REQUEST, ErrorDescription.UNSUPPORTED_ENCRYPTION_ALGORITHM, name); - } - /// /// Parses the encrypted message. /// diff --git a/Growl/Growl.Daemon/Properties/AssemblyInfo.cs b/Growl/Growl.Daemon/Properties/AssemblyInfo.cs index 9d83420..05f601b 100644 --- a/Growl/Growl.Daemon/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Daemon/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Daemon/RequestInfo.cs b/Growl/Growl.Daemon/RequestInfo.cs index c007eba..630806d 100644 --- a/Growl/Growl.Daemon/RequestInfo.cs +++ b/Growl/Growl.Daemon/RequestInfo.cs @@ -170,6 +170,10 @@ internal List HandlingInfo } } + /// + /// Indicates if the request was forwarded from another machine + /// + /// true if the request was forwarded from another machine;false otherwise public bool WasForwarded() { if (this.previousReceivedHeaders != null && this.previousReceivedHeaders.Count > 0) diff --git a/Growl/Growl.Daemon/SubscriptionConnector.cs b/Growl/Growl.Daemon/SubscriptionConnector.cs index 21e5724..99a8834 100644 --- a/Growl/Growl.Daemon/SubscriptionConnector.cs +++ b/Growl/Growl.Daemon/SubscriptionConnector.cs @@ -11,11 +11,16 @@ namespace Growl.Daemon /// /// After calling the method, this class will /// automatically try to renew the subscription at regular intervals in - /// order to keep the subscription alive. + /// order to keep the subscription alive or reestablish it if it fails. /// The renewal interval is determined by the subscribed-to server. /// public class SubscriptionConnector : ConnectorBase, IDisposable { + /// + /// How often to try connecting to the server if it is not available + /// + private const int RETRY_INTERVAL = 30; + /// /// Represents methods that handle responses to 'SUBSCRIBE' requests /// @@ -44,8 +49,12 @@ public class SubscriptionConnector : ConnectorBase, IDisposable /// /// Fires more frequently than the TTL value in order to keep the subscription alive. /// - private System.Timers.Timer timer; + private RenewalTimer timer; + /// + /// A unique ID used each time the timer is started/stopped + /// + private string timerID; /// @@ -72,7 +81,8 @@ public SubscriptionConnector(Subscriber subscriber, string password, string host { this.subscriber = subscriber; - this.timer = new System.Timers.Timer(); + this.timer = new RenewalTimer(); + this.timer.AutoReset = false; this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); } @@ -141,22 +151,28 @@ protected override void OnResponseReceived(string responseText) SubscriptionResponse sr = SubscriptionResponse.FromResponse(response, headers); + ResetTimerBasedOnResponse(sr); + if (sr.IsOK) { - this.ttl = sr.TTL - 30; // try to renew 30 seconds before the server disconnects us - - if (this.ttl > 0) StartRenewalTimer(); - else StopRenewalTimer(); - this.OnOKResponse(sr); } else { - StopRenewalTimer(); this.OnErrorResponse(sr); } } + private void ResetTimerBasedOnResponse(SubscriptionResponse sr) + { + // try to renew 30 seconds before the server disconnects us, or at the retry interval if this failed + this.ttl = (sr.IsOK ? Math.Max((sr.TTL - 30), 0) : RETRY_INTERVAL); + if (this.ttl > 0) + StartRenewalTimer(); + else + StopRenewalTimer(); + } + /// /// Occurs when any of the following network conditions occur: /// 1. Unable to connect to target host for any reason @@ -167,6 +183,7 @@ protected override void OnResponseReceived(string responseText) protected override void OnCommunicationFailure(Response response) { SubscriptionResponse sr = SubscriptionResponse.FromResponse(response, null); + ResetTimerBasedOnResponse(sr); this.OnErrorResponse(sr); } @@ -199,8 +216,11 @@ protected void OnErrorResponse(SubscriptionResponse response) /// private void StartRenewalTimer() { + StopRenewalTimer(); + this.timerID = System.Guid.NewGuid().ToString(); this.timer.Interval = (this.ttl * 1000); this.timer.Start(); + this.timer.ID = this.timerID; } /// @@ -208,6 +228,7 @@ private void StartRenewalTimer() /// private void StopRenewalTimer() { + this.timer.ID = null; this.timer.Stop(); } @@ -218,17 +239,25 @@ private void StopRenewalTimer() /// Event args void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { - RenewSubscription(); + if(this.timerID == this.timer.ID) + RenewSubscription(); } #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected void Dispose(bool disposing) { if (disposing) @@ -245,5 +274,22 @@ protected void Dispose(bool disposing) } #endregion + + private class RenewalTimer : System.Timers.Timer + { + private string id; + + public string ID + { + get + { + return this.id; + } + set + { + this.id = value; + } + } + } } } diff --git a/Growl/Growl.DisplayStyle/DefaultSettingsPanel.cs b/Growl/Growl.DisplayStyle/DefaultSettingsPanel.cs index 6e782d6..aaf5d00 100644 --- a/Growl/Growl.DisplayStyle/DefaultSettingsPanel.cs +++ b/Growl/Growl.DisplayStyle/DefaultSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl.DisplayStyle/ExpandingLabel.cs b/Growl/Growl.DisplayStyle/ExpandingLabel.cs index 8b92455..1d95272 100644 --- a/Growl/Growl.DisplayStyle/ExpandingLabel.cs +++ b/Growl/Growl.DisplayStyle/ExpandingLabel.cs @@ -109,7 +109,7 @@ private Size MeasureStringExtended(string text, Font font, int desWidth, int min * */ Size size = new Size(desWidth, Int32.MaxValue); - TextFormatFlags flags = TextFormatFlags.Default | TextFormatFlags.ExternalLeading | TextFormatFlags.GlyphOverhangPadding | TextFormatFlags.NoClipping | TextFormatFlags.WordBreak; + TextFormatFlags flags = TextFormatFlags.Default | TextFormatFlags.ExternalLeading | TextFormatFlags.GlyphOverhangPadding | TextFormatFlags.NoClipping | TextFormatFlags.WordBreak | TextFormatFlags.LeftAndRightPadding; Size returnSize = TextRenderer.MeasureText(text, font, size, flags); if (returnSize.Height < minHeight) diff --git a/Growl/Growl.DisplayStyle/FadeAnimator.cs b/Growl/Growl.DisplayStyle/FadeAnimator.cs index 9d88329..74a20d3 100644 --- a/Growl/Growl.DisplayStyle/FadeAnimator.cs +++ b/Growl/Growl.DisplayStyle/FadeAnimator.cs @@ -13,12 +13,12 @@ public class FadeAnimator : IAnimator, IDisposable /// /// The default interval for the fade timer /// - private const int TIMER_INTERVAL = 50; + private const int TIMER_INTERVAL = 10; /// /// The maximum value for opacity. (this is kept below 1.0 to avoid a flicker when Windows converts the form to/from a layered window) /// - private const double MAX_OPACITY = 0.99; + public const double MAX_OPACITY = 0.99; /// /// The timer that controls the fading @@ -38,7 +38,7 @@ public class FadeAnimator : IAnimator, IDisposable /// /// The amount of time (in milliseconds) over which the fade-out should occur /// - private int fadeOutDuration = 1000; + private int fadeOutDuration = 500; /// /// The final opacity of the form once faded in @@ -72,7 +72,7 @@ public FadeAnimator(NotificationWindow form) form.AutoClosing += new FormClosingEventHandler(form_AutoClosing); this.timer = new Timer(); - this.timer.Interval = 50; + this.timer.Interval = TIMER_INTERVAL; this.timer.Tick += new EventHandler(timer_Tick); } @@ -196,12 +196,19 @@ void form_AutoClosing(object sender, FormClosingEventArgs e) #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.DisplayStyle/Growl.DisplayStyle.csproj b/Growl/Growl.DisplayStyle/Growl.DisplayStyle.csproj index 21a45b7..2109f70 100644 --- a/Growl/Growl.DisplayStyle/Growl.DisplayStyle.csproj +++ b/Growl/Growl.DisplayStyle/Growl.DisplayStyle.csproj @@ -32,10 +32,8 @@ - - diff --git a/Growl/Growl.DisplayStyle/NotificationWindow.cs b/Growl/Growl.DisplayStyle/NotificationWindow.cs index adb1003..a0047d9 100644 --- a/Growl/Growl.DisplayStyle/NotificationWindow.cs +++ b/Growl/Growl.DisplayStyle/NotificationWindow.cs @@ -507,6 +507,10 @@ private void InitializeComponent() this.ResumeLayout(false); } + /// + /// Disposes of the resources (other than memory) used by the . + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected override void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.DisplayStyle/PopupAnimator.cs b/Growl/Growl.DisplayStyle/PopupAnimator.cs index a38ce7d..0c1582d 100644 --- a/Growl/Growl.DisplayStyle/PopupAnimator.cs +++ b/Growl/Growl.DisplayStyle/PopupAnimator.cs @@ -14,7 +14,7 @@ public class PopupAnimator : IAnimator, IDisposable /// /// The default interval for the fade timer /// - private const int TIMER_INTERVAL = 50; + private const int TIMER_INTERVAL = 10; /// /// The timer that controls the fading @@ -82,7 +82,7 @@ public PopupAnimator(NotificationWindow form) form.AutoClosing += new System.Windows.Forms.FormClosingEventHandler(form_AutoClosing); this.timer = new Timer(); - this.timer.Interval = 50; + this.timer.Interval = TIMER_INTERVAL; this.timer.Tick += new EventHandler(timer_Tick); } @@ -270,12 +270,19 @@ public enum PopupDirection #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.DisplayStyle/Properties/AssemblyInfo.cs b/Growl/Growl.DisplayStyle/Properties/AssemblyInfo.cs index c947020..a7c8c3c 100644 --- a/Growl/Growl.DisplayStyle/Properties/AssemblyInfo.cs +++ b/Growl/Growl.DisplayStyle/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.DisplayStyle/SettingsPanelBase.cs b/Growl/Growl.DisplayStyle/SettingsPanelBase.cs index 89631f9..e63a637 100644 --- a/Growl/Growl.DisplayStyle/SettingsPanelBase.cs +++ b/Growl/Growl.DisplayStyle/SettingsPanelBase.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl.DisplayStyle/Utility.cs b/Growl/Growl.DisplayStyle/Utility.cs index 5c65fa6..9090d00 100644 --- a/Growl/Growl.DisplayStyle/Utility.cs +++ b/Growl/Growl.DisplayStyle/Utility.cs @@ -7,8 +7,21 @@ namespace Growl.DisplayStyle { + /// + /// Provides common routines used when drawing notification windows + /// public static class Utility { + /// + /// Creates a rounded region. + /// + /// The top. + /// The left. + /// The width. + /// The height. + /// The xradius. + /// The yradius. + /// public static System.Drawing.Region CreateRoundedRegion(int top, int left, int width, int height, int xradius, int yradius) { System.Drawing.Region r = null; @@ -25,11 +38,26 @@ public static System.Drawing.Region CreateRoundedRegion(int top, int left, int w return r; } - public static void UpdateLayeredWindow(Bitmap bitmap, Form form, int x, int y) + /// + /// Updates the layered window. + /// + /// The image to uses as the window background + /// The form containing any controls to draw + /// The x position + /// The y position + public static void UpdateLayeredWindow(Bitmap b, Form form, int x, int y) { - UpdateLayeredWindow(bitmap, form, x, y, 255); + UpdateLayeredWindow(b, form, x, y, 255); } + /// + /// Updates the layered window. + /// + /// The image to uses as the window background + /// The form containing any controls to draw + /// The x position + /// The y position + /// The opacity public static void UpdateLayeredWindow(Bitmap b, Form form, int x, int y, byte opacity) { if (b.PixelFormat != System.Drawing.Imaging.PixelFormat.Format32bppArgb) @@ -111,6 +139,12 @@ public static void UpdateLayeredWindow(Bitmap b, Form form, int x, int y, byte o } } + /// + /// Draws the control to bitmap. + /// + /// The control to draw + /// The bitmap to draw on + /// The bounds of the area to draw on private static void DrawControlToBitmap(Control control, Bitmap bitmap, Rectangle targetBounds) { if (bitmap == null) diff --git a/Growl/Growl.DisplayStyle/Win32Animator.cs b/Growl/Growl.DisplayStyle/Win32Animator.cs index 1482e63..174ff62 100644 --- a/Growl/Growl.DisplayStyle/Win32Animator.cs +++ b/Growl/Growl.DisplayStyle/Win32Animator.cs @@ -379,12 +379,19 @@ private void Form_Closing(object sender, CancelEventArgs e) #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. private void Dispose(bool disposing) { if (disposing) diff --git a/Growl/Growl.Displays.Plain/Growl.Displays.Plain.csproj b/Growl/Growl.Displays.Plain/Growl.Displays.Plain.csproj index ce68f7d..c3ac288 100644 --- a/Growl/Growl.Displays.Plain/Growl.Displays.Plain.csproj +++ b/Growl/Growl.Displays.Plain/Growl.Displays.Plain.csproj @@ -30,10 +30,8 @@ - - diff --git a/Growl/Growl.Displays.Plain/PlainSettingsPanel.cs b/Growl/Growl.Displays.Plain/PlainSettingsPanel.cs index cbf8fbc..b1517f1 100644 --- a/Growl/Growl.Displays.Plain/PlainSettingsPanel.cs +++ b/Growl/Growl.Displays.Plain/PlainSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; using Growl.DisplayStyle; diff --git a/Growl/Growl.Displays.Plain/PlainWindow.cs b/Growl/Growl.Displays.Plain/PlainWindow.cs index 48c724f..2bdafaa 100644 --- a/Growl/Growl.Displays.Plain/PlainWindow.cs +++ b/Growl/Growl.Displays.Plain/PlainWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl.Displays.Plain/Properties/AssemblyInfo.cs b/Growl/Growl.Displays.Plain/Properties/AssemblyInfo.cs index 1faab59..3976238 100644 --- a/Growl/Growl.Displays.Plain/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Displays.Plain/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Displays.Smokestack/Growl.Displays.Smokestack.csproj b/Growl/Growl.Displays.Smokestack/Growl.Displays.Smokestack.csproj index ff31a61..10e755e 100644 --- a/Growl/Growl.Displays.Smokestack/Growl.Displays.Smokestack.csproj +++ b/Growl/Growl.Displays.Smokestack/Growl.Displays.Smokestack.csproj @@ -33,10 +33,8 @@ - - diff --git a/Growl/Growl.Displays.Smokestack/Properties/AssemblyInfo.cs b/Growl/Growl.Displays.Smokestack/Properties/AssemblyInfo.cs index 420b149..84528fe 100644 --- a/Growl/Growl.Displays.Smokestack/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Displays.Smokestack/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Displays.Smokestack/SmokestackSettingsPanel.cs b/Growl/Growl.Displays.Smokestack/SmokestackSettingsPanel.cs index 8bd6f7e..25e858c 100644 --- a/Growl/Growl.Displays.Smokestack/SmokestackSettingsPanel.cs +++ b/Growl/Growl.Displays.Smokestack/SmokestackSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; using Growl.DisplayStyle; diff --git a/Growl/Growl.Displays.Smokestack/SmokestackWindow.cs b/Growl/Growl.Displays.Smokestack/SmokestackWindow.cs index df1c412..4e07911 100644 --- a/Growl/Growl.Displays.Smokestack/SmokestackWindow.cs +++ b/Growl/Growl.Displays.Smokestack/SmokestackWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; @@ -46,7 +45,7 @@ public SmokestackWindow() { InitializeComponent(); - this.Animator = new FadeAnimator(this, 250, 250, 1.0); + this.Animator = new FadeAnimator(this, 250, 100, 0.8); HookUpClickEvents(this); diff --git a/Growl/Growl.Displays.Standard/Growl.Displays.Standard.csproj b/Growl/Growl.Displays.Standard/Growl.Displays.Standard.csproj index 148757e..d4b0983 100644 --- a/Growl/Growl.Displays.Standard/Growl.Displays.Standard.csproj +++ b/Growl/Growl.Displays.Standard/Growl.Displays.Standard.csproj @@ -33,10 +33,8 @@ - - diff --git a/Growl/Growl.Displays.Standard/Properties/AssemblyInfo.cs b/Growl/Growl.Displays.Standard/Properties/AssemblyInfo.cs index 80958cb..ec55e76 100644 --- a/Growl/Growl.Displays.Standard/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Displays.Standard/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Displays.Standard/StandardSettingsPanel.cs b/Growl/Growl.Displays.Standard/StandardSettingsPanel.cs index 6f1d391..01f6b8e 100644 --- a/Growl/Growl.Displays.Standard/StandardSettingsPanel.cs +++ b/Growl/Growl.Displays.Standard/StandardSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; using Growl.DisplayStyle; diff --git a/Growl/Growl.Displays.Standard/StandardWindow.cs b/Growl/Growl.Displays.Standard/StandardWindow.cs index b1dd104..5b5c571 100644 --- a/Growl/Growl.Displays.Standard/StandardWindow.cs +++ b/Growl/Growl.Displays.Standard/StandardWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; @@ -28,7 +27,7 @@ public StandardWindow() this.Load += new EventHandler(StandardWindow_Load); this.FormClosed += new FormClosedEventHandler(StandardWindow_FormClosed); - this.Animator = new FadeAnimator(this); + this.Animator = new FadeAnimator(this, 300, 250, FadeAnimator.MAX_OPACITY); HookUpClickEvents(this); diff --git a/Growl/Growl.Displays.Toast/Growl.Displays.Toast.csproj b/Growl/Growl.Displays.Toast/Growl.Displays.Toast.csproj index d0485cf..bbc81ea 100644 --- a/Growl/Growl.Displays.Toast/Growl.Displays.Toast.csproj +++ b/Growl/Growl.Displays.Toast/Growl.Displays.Toast.csproj @@ -31,10 +31,8 @@ - - diff --git a/Growl/Growl.Displays.Toast/Properties/AssemblyInfo.cs b/Growl/Growl.Displays.Toast/Properties/AssemblyInfo.cs index 7b50a7a..82e5a4a 100644 --- a/Growl/Growl.Displays.Toast/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Displays.Toast/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Displays.Toast/ToastWindow.cs b/Growl/Growl.Displays.Toast/ToastWindow.cs index 298c057..b3ce4e2 100644 --- a/Growl/Growl.Displays.Toast/ToastWindow.cs +++ b/Growl/Growl.Displays.Toast/ToastWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; @@ -23,7 +22,7 @@ public ToastWindow() HookUpClickEvents(this, true, true); - this.Animator = new PopupAnimator(this, 600, 300, PopupAnimator.PopupDirection.Up); + this.Animator = new PopupAnimator(this, 400, 150, PopupAnimator.PopupDirection.Up); this.AutoClose(4000); diff --git a/Growl/Growl.Displays.Visor/Growl.Displays.Visor.csproj b/Growl/Growl.Displays.Visor/Growl.Displays.Visor.csproj index 90bb085..68117e6 100644 --- a/Growl/Growl.Displays.Visor/Growl.Displays.Visor.csproj +++ b/Growl/Growl.Displays.Visor/Growl.Displays.Visor.csproj @@ -32,10 +32,8 @@ - - diff --git a/Growl/Growl.Displays.Visor/Properties/AssemblyInfo.cs b/Growl/Growl.Displays.Visor/Properties/AssemblyInfo.cs index 859e531..a46d9ca 100644 --- a/Growl/Growl.Displays.Visor/Properties/AssemblyInfo.cs +++ b/Growl/Growl.Displays.Visor/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.Displays.Visor/VisorSettingsPanel.cs b/Growl/Growl.Displays.Visor/VisorSettingsPanel.cs index d9bfbe9..8f153e6 100644 --- a/Growl/Growl.Displays.Visor/VisorSettingsPanel.cs +++ b/Growl/Growl.Displays.Visor/VisorSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; using Growl.DisplayStyle; diff --git a/Growl/Growl.Displays.Visor/VisorWindow.cs b/Growl/Growl.Displays.Visor/VisorWindow.cs index fd10481..743d94f 100644 --- a/Growl/Growl.Displays.Visor/VisorWindow.cs +++ b/Growl/Growl.Displays.Visor/VisorWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl.Localization.de-DE/Growl.Localization.de-DE.csproj b/Growl/Growl.Localization.de-DE/Growl.Localization.de-DE.csproj index 870572b..b3b4366 100644 --- a/Growl/Growl.Localization.de-DE/Growl.Localization.de-DE.csproj +++ b/Growl/Growl.Localization.de-DE/Growl.Localization.de-DE.csproj @@ -29,8 +29,6 @@ - - diff --git a/Growl/Growl.Localization.en-GB/Growl.Localization.en-GB.csproj b/Growl/Growl.Localization.en-GB/Growl.Localization.en-GB.csproj index 2aeebdb..d46c2a3 100644 --- a/Growl/Growl.Localization.en-GB/Growl.Localization.en-GB.csproj +++ b/Growl/Growl.Localization.en-GB/Growl.Localization.en-GB.csproj @@ -30,8 +30,6 @@ - - diff --git a/Growl/Growl.Localization.ja-JP/Growl.Localization.ja-JP.csproj b/Growl/Growl.Localization.ja-JP/Growl.Localization.ja-JP.csproj index 66514c1..b342b2a 100644 --- a/Growl/Growl.Localization.ja-JP/Growl.Localization.ja-JP.csproj +++ b/Growl/Growl.Localization.ja-JP/Growl.Localization.ja-JP.csproj @@ -30,8 +30,6 @@ - - diff --git a/Growl/Growl.Localization.nb-NO/Growl.Localization.nb-NO.csproj b/Growl/Growl.Localization.nb-NO/Growl.Localization.nb-NO.csproj index 4428c2e..e1ab937 100644 --- a/Growl/Growl.Localization.nb-NO/Growl.Localization.nb-NO.csproj +++ b/Growl/Growl.Localization.nb-NO/Growl.Localization.nb-NO.csproj @@ -29,8 +29,6 @@ - - diff --git a/Growl/Growl.Localization.nl-NL/Growl.Localization.nl-NL.csproj b/Growl/Growl.Localization.nl-NL/Growl.Localization.nl-NL.csproj index bdb7846..28a9a57 100644 --- a/Growl/Growl.Localization.nl-NL/Growl.Localization.nl-NL.csproj +++ b/Growl/Growl.Localization.nl-NL/Growl.Localization.nl-NL.csproj @@ -30,8 +30,6 @@ - - diff --git a/Growl/Growl.UDPLegacy/Growl.UDPLegacy.csproj b/Growl/Growl.UDPLegacy/Growl.UDPLegacy.csproj index 4f76a6b..6f867e3 100644 --- a/Growl/Growl.UDPLegacy/Growl.UDPLegacy.csproj +++ b/Growl/Growl.UDPLegacy/Growl.UDPLegacy.csproj @@ -31,8 +31,6 @@ - - diff --git a/Growl/Growl.UDPLegacy/Properties/AssemblyInfo.cs b/Growl/Growl.UDPLegacy/Properties/AssemblyInfo.cs index 2c065b9..d765884 100644 --- a/Growl/Growl.UDPLegacy/Properties/AssemblyInfo.cs +++ b/Growl/Growl.UDPLegacy/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] +[assembly: AssemblyFileVersion("2.0.0.24")] [assembly: AssemblyInformationalVersion("2.0")] diff --git a/Growl/Growl.sln b/Growl/Growl.sln index 58ffaf2..0ae47ab 100644 --- a/Growl/Growl.sln +++ b/Growl/Growl.sln @@ -1,10 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Growl.Connector", "Growl.Connector\Growl.Connector.csproj", "{19C22138-B905-47BA-9E6E-EF9356907E53}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test App", "Test App\Test App.csproj", "{453F9C34-68B5-45A4-B34B-96607C6A4680}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Growl.Daemon", "Growl.Daemon\Growl.Daemon.csproj", "{6112CD52-1F16-4068-8D16-CB9C5467E8C3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test Server", "Test Server\Test Server.csproj", "{25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}" @@ -39,86 +35,121 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Growl.Localization.de-DE", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Growl.Localization.nb-NO", "Growl.Localization.nb-NO\Growl.Localization.nb-NO.csproj", "{BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Growl.Connector", "Growl.Connector\Growl.Connector.csproj", "{19C22138-B905-47BA-9E6E-EF9356907E53}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Mono|Any CPU = Mono|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {19C22138-B905-47BA-9E6E-EF9356907E53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {19C22138-B905-47BA-9E6E-EF9356907E53}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19C22138-B905-47BA-9E6E-EF9356907E53}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19C22138-B905-47BA-9E6E-EF9356907E53}.Release|Any CPU.Build.0 = Release|Any CPU - {453F9C34-68B5-45A4-B34B-96607C6A4680}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {453F9C34-68B5-45A4-B34B-96607C6A4680}.Debug|Any CPU.Build.0 = Debug|Any CPU - {453F9C34-68B5-45A4-B34B-96607C6A4680}.Release|Any CPU.ActiveCfg = Release|Any CPU - {453F9C34-68B5-45A4-B34B-96607C6A4680}.Release|Any CPU.Build.0 = Release|Any CPU {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Mono|Any CPU.ActiveCfg = Mono|Any CPU + {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Mono|Any CPU.Build.0 = Mono|Any CPU {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {6112CD52-1F16-4068-8D16-CB9C5467E8C3}.Release|Any CPU.Build.0 = Release|Any CPU {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Mono|Any CPU.Build.0 = Release|Any CPU {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Release|Any CPU.ActiveCfg = Release|Any CPU {25D4D0A4-22D0-4E87-A8D6-A58AA592D28C}.Release|Any CPU.Build.0 = Release|Any CPU {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Mono|Any CPU.Build.0 = Release|Any CPU {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Release|Any CPU.ActiveCfg = Release|Any CPU {D4FAD0E4-FD93-4379-8684-F3288F06A588}.Release|Any CPU.Build.0 = Release|Any CPU {901C016A-9008-4190-A067-E578E7E66B1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {901C016A-9008-4190-A067-E578E7E66B1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {901C016A-9008-4190-A067-E578E7E66B1A}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {901C016A-9008-4190-A067-E578E7E66B1A}.Mono|Any CPU.Build.0 = Release|Any CPU {901C016A-9008-4190-A067-E578E7E66B1A}.Release|Any CPU.ActiveCfg = Release|Any CPU {901C016A-9008-4190-A067-E578E7E66B1A}.Release|Any CPU.Build.0 = Release|Any CPU {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Mono|Any CPU.Build.0 = Release|Any CPU {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Release|Any CPU.ActiveCfg = Release|Any CPU {97E4D21E-FD5C-47D9-BC28-AE5EE8B6288D}.Release|Any CPU.Build.0 = Release|Any CPU {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Mono|Any CPU.Build.0 = Release|Any CPU {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {6CAA2424-5F26-4C76-A1B3-EF9FFE1194D4}.Release|Any CPU.Build.0 = Release|Any CPU {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Mono|Any CPU.Build.0 = Release|Any CPU {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AB6E71F-59BF-4E45-A9D9-84BCEAA4731C}.Release|Any CPU.Build.0 = Release|Any CPU {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Mono|Any CPU.Build.0 = Release|Any CPU {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C213ABF-3B98-4AC6-BD93-CA7EFD2174BD}.Release|Any CPU.Build.0 = Release|Any CPU {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Mono|Any CPU.ActiveCfg = Mono|Any CPU + {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Mono|Any CPU.Build.0 = Mono|Any CPU {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCFE7FCD-6055-4872-95EA-5C4C73DE342D}.Release|Any CPU.Build.0 = Release|Any CPU {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Mono|Any CPU.Build.0 = Release|Any CPU {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {3780640E-ADAE-4F17-AFCB-1158BCDD88D5}.Release|Any CPU.Build.0 = Release|Any CPU {F412ED29-C8E0-408D-BBB7-00A2C8381291}.Debug|Any CPU.ActiveCfg = Debug + {F412ED29-C8E0-408D-BBB7-00A2C8381291}.Mono|Any CPU.ActiveCfg = Release + {F412ED29-C8E0-408D-BBB7-00A2C8381291}.Mono|Any CPU.Build.0 = Release {F412ED29-C8E0-408D-BBB7-00A2C8381291}.Release|Any CPU.ActiveCfg = Release {0D6853EB-B690-4048-9979-1AD80457A65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0D6853EB-B690-4048-9979-1AD80457A65B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D6853EB-B690-4048-9979-1AD80457A65B}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {0D6853EB-B690-4048-9979-1AD80457A65B}.Mono|Any CPU.Build.0 = Release|Any CPU {0D6853EB-B690-4048-9979-1AD80457A65B}.Release|Any CPU.ActiveCfg = Release|Any CPU {0D6853EB-B690-4048-9979-1AD80457A65B}.Release|Any CPU.Build.0 = Release|Any CPU {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Mono|Any CPU.Build.0 = Release|Any CPU {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Release|Any CPU.ActiveCfg = Release|Any CPU {8D29E78A-8203-4037-9A14-C8D46A4C323C}.Release|Any CPU.Build.0 = Release|Any CPU {98141345-02ED-4928-8177-B77DCFEA3462}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {98141345-02ED-4928-8177-B77DCFEA3462}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98141345-02ED-4928-8177-B77DCFEA3462}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {98141345-02ED-4928-8177-B77DCFEA3462}.Mono|Any CPU.Build.0 = Release|Any CPU {98141345-02ED-4928-8177-B77DCFEA3462}.Release|Any CPU.ActiveCfg = Release|Any CPU {98141345-02ED-4928-8177-B77DCFEA3462}.Release|Any CPU.Build.0 = Release|Any CPU {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Mono|Any CPU.Build.0 = Release|Any CPU {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {FCE7A843-0E7E-4BF0-8FD1-08200A8A51A2}.Release|Any CPU.Build.0 = Release|Any CPU {774E3560-B4CA-4041-A21E-A9437FD3C932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {774E3560-B4CA-4041-A21E-A9437FD3C932}.Debug|Any CPU.Build.0 = Debug|Any CPU + {774E3560-B4CA-4041-A21E-A9437FD3C932}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {774E3560-B4CA-4041-A21E-A9437FD3C932}.Mono|Any CPU.Build.0 = Release|Any CPU {774E3560-B4CA-4041-A21E-A9437FD3C932}.Release|Any CPU.ActiveCfg = Release|Any CPU {774E3560-B4CA-4041-A21E-A9437FD3C932}.Release|Any CPU.Build.0 = Release|Any CPU {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Mono|Any CPU.ActiveCfg = Release|Any CPU + {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Mono|Any CPU.Build.0 = Release|Any CPU {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Release|Any CPU.ActiveCfg = Release|Any CPU {BED0DDCE-6C19-4487-86A0-CD58F2DC5F66}.Release|Any CPU.Build.0 = Release|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Mono|Any CPU.ActiveCfg = Mono|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Mono|Any CPU.Build.0 = Mono|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19C22138-B905-47BA-9E6E-EF9356907E53}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Growl/Growl/AddComputer.cs b/Growl/Growl/AddComputer.cs index 08dd396..78248d0 100644 --- a/Growl/Growl/AddComputer.cs +++ b/Growl/Growl/AddComputer.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/ChooseForwarding.cs b/Growl/Growl/ChooseForwarding.cs index 1ce3bc3..35be783 100644 --- a/Growl/Growl/ChooseForwarding.cs +++ b/Growl/Growl/ChooseForwarding.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/Growl.csproj b/Growl/Growl/Growl.csproj index efc4d8a..8069765 100644 --- a/Growl/Growl/Growl.csproj +++ b/Growl/Growl/Growl.csproj @@ -45,13 +45,12 @@ - - + diff --git a/Growl/Growl/MainForm.cs b/Growl/Growl/MainForm.cs index 4b87347..20fd5f5 100644 --- a/Growl/Growl/MainForm.cs +++ b/Growl/Growl/MainForm.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; @@ -99,22 +98,6 @@ public MainForm() idleAfterText = String.Format(idleAfterText, " "); // this leaves space for the textbox } this.radioButtonIdleAfter.Text = idleAfterText; - - try - { - KeysConverter kc = new KeysConverter(); - this.closeLastKeyCombo = (Keys)kc.ConvertFromString(Properties.Settings.Default.KeyboardShortcutCloseLast); - this.closeAllKeyCombo = (Keys)kc.ConvertFromString(Properties.Settings.Default.KeyboardShortcutCloseAll); - - this.closeLastHotKey = new HotKeyManager(this, this.closeLastKeyCombo); - this.closeAllHotKey = new HotKeyManager(this, this.closeAllKeyCombo); - - this.closeLastHotKey.Register(); - this.closeAllHotKey.Register(); - } - catch - { - } } # region visual style @@ -538,16 +521,7 @@ protected override void Dispose(bool disposing) historyTrackBarTimer = null; } - if (this.closeLastHotKey != null) - { - this.closeLastHotKey.Dispose(); - this.closeLastHotKey = null; - } - if (this.closeAllHotKey != null) - { - this.closeAllHotKey.Dispose(); - this.closeAllHotKey = null; - } + UnregisterHotKeys(); //StopInterceptingSystemBalloons(); } @@ -1279,6 +1253,45 @@ void passwordManagerControl1_Updated(object sender, EventArgs e) this.controller.SavePasswordPrefs(); } + public void RegisterHotKeys() + { + try + { + KeysConverter kc = new KeysConverter(); + + if (this.closeLastHotKey == null) + { + this.closeLastKeyCombo = (Keys)kc.ConvertFromString(Properties.Settings.Default.KeyboardShortcutCloseLast); + this.closeLastHotKey = new HotKeyManager(this, this.closeLastKeyCombo); + this.closeLastHotKey.Register(); + } + + if (this.closeAllHotKey == null) + { + this.closeAllKeyCombo = (Keys)kc.ConvertFromString(Properties.Settings.Default.KeyboardShortcutCloseAll); + this.closeAllHotKey = new HotKeyManager(this, this.closeAllKeyCombo); + this.closeAllHotKey.Register(); + } + } + catch + { + } + } + + public void UnregisterHotKeys() + { + if (this.closeLastHotKey != null) + { + this.closeLastHotKey.Dispose(); + this.closeLastHotKey = null; + } + if (this.closeAllHotKey != null) + { + this.closeAllHotKey.Dispose(); + this.closeAllHotKey = null; + } + } + protected override void WndProc(ref Message m) { // check if we got a hot key pressed. diff --git a/Growl/Growl/Properties/AssemblyInfo.cs b/Growl/Growl/Properties/AssemblyInfo.cs index 38b7f98..3222075 100644 --- a/Growl/Growl/Properties/AssemblyInfo.cs +++ b/Growl/Growl/Properties/AssemblyInfo.cs @@ -33,6 +33,6 @@ // Revision // [assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.22")] -[assembly: AssemblyInformationalVersion("2.0rc2")] +[assembly: AssemblyFileVersion("2.0.0.24")] +[assembly: AssemblyInformationalVersion("2.0rc4")] [assembly: NeutralResourcesLanguageAttribute("en-US")] diff --git a/Growl/Growl/Properties/Settings.Designer.cs b/Growl/Growl/Properties/Settings.Designer.cs index 68ccd4d..3638490 100644 --- a/Growl/Growl/Properties/Settings.Designer.cs +++ b/Growl/Growl/Properties/Settings.Designer.cs @@ -336,6 +336,7 @@ public bool MuteAllSounds { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("False")] public bool DisableBonjour { @@ -348,6 +349,7 @@ public bool DisableBonjour { } [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] public string MachineID { @@ -358,5 +360,57 @@ public string MachineID { this["MachineID"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool DisableMissedNotifications { + get { + return ((bool)(this["DisableMissedNotifications"])); + } + set { + this["DisableMissedNotifications"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("SHA256")] + public string GNTPForwardHashType { + get { + return ((string)(this["GNTPForwardHashType"])); + } + set { + this["GNTPForwardHashType"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("AES")] + public string GNTPForwardEncryptionAlgorithm { + get { + return ((string)(this["GNTPForwardEncryptionAlgorithm"])); + } + set { + this["GNTPForwardEncryptionAlgorithm"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Configuration.SettingsProviderAttribute(typeof(Growl.UserSettingsProvider))] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("growl@growlforwindows.com")] + public string EmailForwardFromAddress { + get { + return ((string)(this["EmailForwardFromAddress"])); + } + set { + this["EmailForwardFromAddress"] = value; + } + } } } diff --git a/Growl/Growl/Properties/Settings.settings b/Growl/Growl/Properties/Settings.settings index dc9bcc4..f264fea 100644 --- a/Growl/Growl/Properties/Settings.settings +++ b/Growl/Growl/Properties/Settings.settings @@ -74,11 +74,23 @@ False - + False - + + + False + + + SHA256 + + + AES + + + growl@growlforwindows.com + \ No newline at end of file diff --git a/Growl/Growl/SplashScreen.cs b/Growl/Growl/SplashScreen.cs index c8c5664..c99cee7 100644 --- a/Growl/Growl/SplashScreen.cs +++ b/Growl/Growl/SplashScreen.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; diff --git a/Growl/Growl/UI/EmailForwardInputs.cs b/Growl/Growl/UI/EmailForwardInputs.cs index 1205ff7..ac4ad92 100644 --- a/Growl/Growl/UI/EmailForwardInputs.cs +++ b/Growl/Growl/UI/EmailForwardInputs.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; @@ -148,6 +147,7 @@ private void linkLabelEditSMTPValues_LinkClicked(object sender, LinkLabelLinkCli this.textBoxSMTPUsername.Enabled = this.smtp.UseAuthentication; this.textBoxSMTPPassword.Enabled = this.smtp.UseAuthentication; + OnValidChanged(false); this.panelSMTPSettings.Visible = true; } @@ -162,6 +162,7 @@ private void linkLabelSMTPDone_LinkClicked(object sender, LinkLabelLinkClickedEv this.labelSMTPValues.Text = String.Format("{0}", this.smtp.Host); this.panelSMTPSettings.Visible = false; + ValidateInputs(); } private void checkBoxSMTPUseAuthentication_CheckedChanged(object sender, EventArgs e) diff --git a/Growl/Growl/UI/ForwardDestinationInputs.cs b/Growl/Growl/UI/ForwardDestinationInputs.cs index 0332a09..546faee 100644 --- a/Growl/Growl/UI/ForwardDestinationInputs.cs +++ b/Growl/Growl/UI/ForwardDestinationInputs.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/UI/ForwardDestinationSettingsPanel.cs b/Growl/Growl/UI/ForwardDestinationSettingsPanel.cs index 4919802..aff8c2f 100644 --- a/Growl/Growl/UI/ForwardDestinationSettingsPanel.cs +++ b/Growl/Growl/UI/ForwardDestinationSettingsPanel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/UI/MissedNotificationsWindow.cs b/Growl/Growl/UI/MissedNotificationsWindow.cs index 16b0729..73b30ba 100644 --- a/Growl/Growl/UI/MissedNotificationsWindow.cs +++ b/Growl/Growl/UI/MissedNotificationsWindow.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; diff --git a/Growl/Growl/UI/OnOffButton.cs b/Growl/Growl/UI/OnOffButton.cs index af810ac..381d39b 100644 --- a/Growl/Growl/UI/OnOffButton.cs +++ b/Growl/Growl/UI/OnOffButton.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/UI/PasswordManagerControl.cs b/Growl/Growl/UI/PasswordManagerControl.cs index 2047898..cf34be1 100644 --- a/Growl/Growl/UI/PasswordManagerControl.cs +++ b/Growl/Growl/UI/PasswordManagerControl.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/UI/ProwlForwardInputs.cs b/Growl/Growl/UI/ProwlForwardInputs.cs index 30e83ea..092df61 100644 --- a/Growl/Growl/UI/ProwlForwardInputs.cs +++ b/Growl/Growl/UI/ProwlForwardInputs.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/UI/TransparentPanel.cs b/Growl/Growl/UI/TransparentPanel.cs index c4ed342..4263fb7 100644 --- a/Growl/Growl/UI/TransparentPanel.cs +++ b/Growl/Growl/UI/TransparentPanel.cs @@ -5,7 +5,6 @@ using System.Security; using System.Security.Permissions; using System.Windows.Forms; -using System.Data; namespace Growl.UI { diff --git a/Growl/Growl/UI/TwitterForwardInputs.cs b/Growl/Growl/UI/TwitterForwardInputs.cs index 1aab313..7353169 100644 --- a/Growl/Growl/UI/TwitterForwardInputs.cs +++ b/Growl/Growl/UI/TwitterForwardInputs.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Data; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/_source/AutoUpdate/UpdateForm.cs b/Growl/Growl/_source/AutoUpdate/UpdateForm.cs index 15544ea..a1c5c55 100644 --- a/Growl/Growl/_source/AutoUpdate/UpdateForm.cs +++ b/Growl/Growl/_source/AutoUpdate/UpdateForm.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; diff --git a/Growl/Growl/_source/Bonjour.cs b/Growl/Growl/_source/Bonjour.cs index 1658898..72ee7cb 100644 --- a/Growl/Growl/_source/Bonjour.cs +++ b/Growl/Growl/_source/Bonjour.cs @@ -58,6 +58,7 @@ public void Start() } catch(Exception ex) { + System.Diagnostics.Debug.WriteLine(String.Format("Bonjour service browser not started - {0}", ex.Message)); isStarted = false; } } diff --git a/Growl/Growl/_source/Controller.cs b/Growl/Growl/_source/Controller.cs index ec5c967..56fcfa6 100644 --- a/Growl/Growl/_source/Controller.cs +++ b/Growl/Growl/_source/Controller.cs @@ -477,7 +477,15 @@ void display_NotificationCallback(Growl.Daemon.CallbackInfo cbInfo, Growl.CoreLi private void OpenUrl(object state) { string url = (string)state; - System.Diagnostics.Process.Start(url); + try + { + System.Diagnostics.Process.Start(url); + } + catch (Exception ex) + { + // TODO: this is temporary (and thus not localized either) // LOCALIZE: + SendSystemNotification("Callback failure", string.Format("Could not start or open '{0}':\r\n{1}", url, ex.Message)); + } } private void LoadForwardedComputers() @@ -805,7 +813,8 @@ public void InvokeShowMissedNotifications(List missedNotificat private void ShowMissedNotifications(List missedNotifications) { - this.missedNotificationsDisplay.HandleNotification(missedNotifications); + if(!Properties.Settings.Default.DisableMissedNotifications) + this.missedNotificationsDisplay.HandleNotification(missedNotifications); } private void InvokeRefreshActiveNotifications() diff --git a/Growl/Growl/_source/EmailForwardDestination.cs b/Growl/Growl/_source/EmailForwardDestination.cs index d38b617..ca8fc9d 100644 --- a/Growl/Growl/_source/EmailForwardDestination.cs +++ b/Growl/Growl/_source/EmailForwardDestination.cs @@ -93,6 +93,24 @@ public override string AddressDisplay } } + private string FromAddress + { + get + { + try + { + string from = Properties.Settings.Default.EmailForwardFromAddress; + System.Net.Mail.MailAddress address = new System.Net.Mail.MailAddress(from); // this ensures that the address is valid (properly formatted) + return from; + } + catch + { + Utility.WriteDebugInfo(String.Format("Invalid email address configured as 'From' address: '{0}' - using default address instead.", Properties.Settings.Default.EmailForwardFromAddress)); + return "growl@growlforwindows.com"; + } + } + } + public override ForwardDestination Clone() { EmailForwardDestination clone = new EmailForwardDestination(this.Description, this.Enabled, this.To, this.SMTPConfiguration, this.MinimumPriority, this.OnlyWhenIdle); @@ -128,11 +146,12 @@ private void Send(string appName, string subject, Growl.Connector.Priority prior { System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage(); m.To.Add(this.to); - m.From = new System.Net.Mail.MailAddress("growl@growlforwindows.com", appName); + m.From = new System.Net.Mail.MailAddress(this.FromAddress, appName); m.Subject = subject; m.Body = message; m.Priority = GetMessagePriority(priority); m.Sender = new System.Net.Mail.MailAddress("growl@growlforwindows.com", "Growl for Windows"); + m.Headers.Add("X-Growl-Origin-Application", appName); // send the email using another thread (since the Smtp.SendAsync seems to be flakey) System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(SendAsync), m); diff --git a/Growl/Growl/_source/GNTPForwardDestination.cs b/Growl/Growl/_source/GNTPForwardDestination.cs index e2ae7fe..1bb40c4 100644 --- a/Growl/Growl/_source/GNTPForwardDestination.cs +++ b/Growl/Growl/_source/GNTPForwardDestination.cs @@ -68,6 +68,36 @@ public string Password } } + public override Cryptography.HashAlgorithmType HashAlgorithm + { + get + { + try + { + return Cryptography.GetKeyHashType(Properties.Settings.Default.GNTPForwardHashType); + } + catch + { + return Cryptography.HashAlgorithmType.SHA256; + } + } + } + + public override Cryptography.SymmetricAlgorithmType EncryptionAlgorithm + { + get + { + try + { + return Cryptography.GetEncryptionType(Properties.Settings.Default.GNTPForwardEncryptionAlgorithm); + } + catch + { + return Cryptography.SymmetricAlgorithmType.AES; + } + } + } + public override string AddressDisplay { get diff --git a/Growl/Growl/_source/Installation/InstallDisplay.cs b/Growl/Growl/_source/Installation/InstallDisplay.cs index ad89190..3aac123 100644 --- a/Growl/Growl/_source/Installation/InstallDisplay.cs +++ b/Growl/Growl/_source/Installation/InstallDisplay.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.IO; using System.Net; diff --git a/Growl/Growl/_source/Installation/InstallLanguage.cs b/Growl/Growl/_source/Installation/InstallLanguage.cs index a6d8f20..ce027a6 100644 --- a/Growl/Growl/_source/Installation/InstallLanguage.cs +++ b/Growl/Growl/_source/Installation/InstallLanguage.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Data; using System.Drawing; using System.IO; using System.Net; diff --git a/Growl/Growl/_source/Program.cs b/Growl/Growl/_source/Program.cs index 63021bf..e90c44e 100644 --- a/Growl/Growl/_source/Program.cs +++ b/Growl/Growl/_source/Program.cs @@ -187,6 +187,7 @@ private void BeginInitializeApplication() this.mainForm = new MainForm(); IntPtr handle = this.mainForm.Handle; // this forces the creation of the handle even when the form is not shown //this.mainForm.ShowForm(); + this.mainForm.RegisterHotKeys(); // initialization timer (we do the bulk of the initialization in the timer.Tick so that 1) the splash screen can draw completely without being held up, and 2) it frees up the UI thread) this.initializationTimer = new Timer(); @@ -612,13 +613,7 @@ public bool InvokeRequired #region IDisposable Members - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - protected void Dispose(bool disposing) + protected override void Dispose(bool disposing) { if (disposing) { @@ -669,6 +664,7 @@ protected void Dispose(bool disposing) // suppress } } + base.Dispose(disposing); } #endregion diff --git a/Growl/Growl/_source/Subscription.cs b/Growl/Growl/_source/Subscription.cs index 564ec86..a1c4b7b 100644 --- a/Growl/Growl/_source/Subscription.cs +++ b/Growl/Growl/_source/Subscription.cs @@ -8,8 +8,6 @@ namespace Growl [Serializable] public class Subscription : GNTPForwardDestination, IDeserializationCallback, IDisposable { - private const int RETRY_INTERVAL = 30; - public delegate void SubscriptionStatusChangedEventHandler(Subscription subscription); [field: NonSerialized] @@ -21,9 +19,6 @@ public class Subscription : GNTPForwardDestination, IDeserializationCallback, ID [NonSerialized] private Growl.Daemon.SubscriptionConnector sc; - [NonSerialized] - private System.Timers.Timer timer; - [NonSerialized] private string subscriberID; @@ -99,8 +94,7 @@ public void Update() } else { - EnsureTimer(); - StopRetryTimer(); + Kill(); } this.OnStatusChanged(); } @@ -109,25 +103,22 @@ private void Subscribe() { if (this.Allowed) { - EnsureTimer(); - StopRetryTimer(); - if (this.subscriberID == null) this.subscriberID = Utility.MachineID; this.AdditionalOfflineDisplayInfo = "connecting..."; - if (this.sc != null) this.sc = null; - Growl.Daemon.Subscriber subscriber = new Growl.Daemon.Subscriber(this.subscriberID, Environment.MachineName, Growl.Connector.GrowlConnector.TCP_PORT); - this.sc = new Growl.Daemon.SubscriptionConnector(subscriber, this.Password, this.IPAddress, this.Port); - this.sc.EncryptionAlgorithm = Growl.Connector.Cryptography.SymmetricAlgorithmType.PlainText; - this.sc.OKResponse += new Growl.Daemon.SubscriptionConnector.ResponseEventHandler(sc_OKResponse); - this.sc.ErrorResponse += new Growl.Daemon.SubscriptionConnector.ResponseEventHandler(sc_ErrorResponse); + if (this.sc == null) + { + Growl.Daemon.Subscriber subscriber = new Growl.Daemon.Subscriber(this.subscriberID, Environment.MachineName, Growl.Connector.GrowlConnector.TCP_PORT); + this.sc = new Growl.Daemon.SubscriptionConnector(subscriber, this.Password, this.IPAddress, this.Port); + this.sc.EncryptionAlgorithm = Growl.Connector.Cryptography.SymmetricAlgorithmType.PlainText; + this.sc.OKResponse += new Growl.Daemon.SubscriptionConnector.ResponseEventHandler(sc_OKResponse); + this.sc.ErrorResponse += new Growl.Daemon.SubscriptionConnector.ResponseEventHandler(sc_ErrorResponse); + } this.sc.Subscribe(); } } internal void Kill() { - EnsureTimer(); - StopRetryTimer(); if (this.sc != null) { this.sc.StopRenewing(); @@ -159,8 +150,7 @@ void sc_ErrorResponse(Growl.Daemon.SubscriptionResponse response) this.available = false; OnStatusChanged(); - // if the subscription failed, try again periodically in case the server comes online - StartRetryTimer(); + // if the subscription failed, the SubscriptionConnector will take care of trying to reestablish it } protected void OnStatusChanged() @@ -184,48 +174,11 @@ protected override void OnEnabledChanged(object sender, EventArgs eventArgs) { this.AdditionalOfflineDisplayInfo = "not enabled"; this.AdditionalOnlineDisplayInfo = "not enabled"; - EnsureTimer(); - StopRetryTimer(); + Kill(); } this.OnStatusChanged(); } - private void EnsureTimer() - { - if (this.timer == null) - { - this.timer = new System.Timers.Timer(); - this.timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); - } - } - - /// - /// Starts the retry timer. - /// - private void StartRetryTimer() - { - this.timer.Interval = (RETRY_INTERVAL * 1000); - this.timer.Start(); - } - - /// - /// Stops the retry timer. - /// - private void StopRetryTimer() - { - this.timer.Stop(); - } - - /// - /// Fires when the renewal timer elapses. Renews the caller's subscription. - /// - /// The sender - /// Event args - void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) - { - Subscribe(); - } - #region IDeserializationCallback Members public void OnDeserialization(object sender) @@ -250,7 +203,6 @@ private void Dispose(bool disposing) { if (disposing) { - if (this.timer != null) this.timer.Dispose(); if (this.sc != null) this.sc.Dispose(); } this.disposed = true; diff --git a/Growl/Growl/app.config b/Growl/Growl/app.config index 1291d9b..6d8fe7c 100644 --- a/Growl/Growl/app.config +++ b/Growl/Growl/app.config @@ -94,6 +94,18 @@ + + False + + + SHA256 + + + AES + + + growl@growlforwindows.com + diff --git a/Growl/Growl/release_notes.txt b/Growl/Growl/release_notes.txt index 0564a9b..9e46088 100644 --- a/Growl/Growl/release_notes.txt +++ b/Growl/Growl/release_notes.txt @@ -1,3 +1,25 @@ +RC4 changes +------------------------------ +- updated the Origin-Software-Version header to return the specific file version (ie: 2.0.0.24 instead of 2.0.0.0) +- updated Email Forwarding option to make sure you cant accidentally not save your custom SMTP settings +- changed GNTP forwarding to always encrypt messages (defaults to SHA256/AES) +- fixed a regression bug introduced in RC2 that caused decryption of encrypted requests to corrupt some data (thanks to Laurent) +- fixed a bug that could cause Growl to hang when shutting down +- fixed a bug in the 'Notify' display style that could cut off the last line of text +- fixed a bug in Feed Monitor that prevented it from correctly parsing dates with timezones other than GMT + +RC3 changes +------------------------------ +- updated/added support for localization; Dutch, Japanese, German, Norwegian +- added click-to-install support for language packs +- added ability to set default display by double-clicking its name in the list +- updated GrowlConnector to automatically strip '\r' characters from header values +- fixed a bug in ConnectorBase that didnt handle chunked responses properly (thanks to Rudy @ Growl) +- fixed several bugs that could cause subscription renewals to fire too often +- fixed a bug that caused ListControl headers to redraw improperly (thanks FrozenCow) +- fixed a bug that could crash Growl if a non-existent file path url callback is encountered +- fixed a bug that could cause an OutOfMemoryException when closing down Growl + RC2 changes ------------------------------ - added 'Origin' column to History Detail view diff --git a/Growl/Growl/update.manifest b/Growl/Growl/update.manifest index 8a8d54f..62ac116 100644 --- a/Growl/Growl/update.manifest +++ b/Growl/Growl/update.manifest @@ -1,7 +1,7 @@ - 2.0.0.22 + 2.0.0.24 True - http://www.growlforwindows.com/gfw/updates/gfw3.manifest - http://www.growlforwindows.com/gfw/d.ashx?f=Growl_v2.0rc2.msi + http://www.growlforwindows.com/gfw/updates/gfw.manifest + http://www.growlforwindows.com/gfw/d.ashx?f=Growl_v2.0rc4.msi \ No newline at end of file diff --git a/Growl/Test App/Form1.Designer.cs b/Growl/Test App/Form1.Designer.cs index 7b2786b..360b2b1 100644 --- a/Growl/Test App/Form1.Designer.cs +++ b/Growl/Test App/Form1.Designer.cs @@ -28,7 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.button2 = new System.Windows.Forms.Button(); @@ -36,6 +35,7 @@ private void InitializeComponent() this.button5 = new System.Windows.Forms.Button(); this.textBox2 = new System.Windows.Forms.TextBox(); this.button3 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 @@ -107,11 +107,22 @@ private void InitializeComponent() this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click); // + // button6 + // + this.button6.Location = new System.Drawing.Point(499, 12); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(75, 23); + this.button6.TabIndex = 8; + this.button6.Text = "button6"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(708, 273); + this.Controls.Add(this.button6); this.Controls.Add(this.button3); this.Controls.Add(this.textBox2); this.Controls.Add(this.button5); @@ -135,6 +146,7 @@ private void InitializeComponent() private System.Windows.Forms.Button button5; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button6; } } diff --git a/Growl/Test App/Form1.cs b/Growl/Test App/Form1.cs index 34b7b80..fcb5a08 100644 --- a/Growl/Test App/Form1.cs +++ b/Growl/Test App/Form1.cs @@ -26,18 +26,18 @@ public Form1() this.growl.NotificationCallback +=new GrowlConnector.CallbackEventHandler(growl_NotificationCallback); growl.KeyHashAlgorithm = Cryptography.HashAlgorithmType.SHA256; - growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.PlainText; + //growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.PlainText; //growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.DES; //growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.TripleDES; - //growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.AES; + growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.AES; this.app = new Growl.Connector.Application("SurfWriter"); //app.Icon = "http://atomicbride.com/Apple.gif"; //app.Icon = "http://www.thetroyers.com/images/Apple_Logo.jpg"; //app.Icon = @"c:\apple.png"; - app.Icon = Properties.Resources.Apple; - app.CustomTextAttributes.Add("Creator", "Apple Software"); - app.CustomTextAttributes.Add("Application-ID", "08d6c05a21512a79a1dfeb9d2a8f262f"); + //app.Icon = Properties.Resources.Apple; + //app.CustomTextAttributes.Add("Creator", "Apple Software"); + //app.CustomTextAttributes.Add("Application-ID", "08d6c05a21512a79a1dfeb9d2a8f262f"); //app.CustomBinaryAttributes.Add("Sound", "http://fake.net/app.wav"); @@ -116,13 +116,13 @@ private void button1_Click(object sender, EventArgs e) //nt1.Icon = new BinaryData(new byte[] { 65, 66, 67, 68 }); nt1.Icon = "http://www.hamradio.pl/images/thumb/e/e5/Icon_48x48_star_01.png/48px-Icon_48x48_star_01.png"; nt1.Enabled = false; - nt1.CustomTextAttributes.Add("Language", "English"); - nt1.CustomTextAttributes.Add("Timezone", "PST"); + //nt1.CustomTextAttributes.Add("Language", "English"); + //nt1.CustomTextAttributes.Add("Timezone", "PST"); //nt1.CustomBinaryAttributes.Add("Sound", "http://fake.net/nt.wav"); NotificationType nt2 = new NotificationType("Document Published", "Document successfully published", null, true); nt2.Icon = "http://coaching.typepad.com/EspressoPundit/feed-icon-legacy_blue_38.png"; //nt2.CustomBinaryAttributes.Add("Sound", "http://fake.net/sound.wav"); - nt2.CustomBinaryAttributes.Add("Sound-Alt", new BinaryData(new byte[] { 70, 71, 72, 73 })); + //nt2.CustomBinaryAttributes.Add("Sound-Alt", new BinaryData(new byte[] { 70, 71, 72, 73 })); NotificationType[] types = new NotificationType[] { nt1, nt2 }; @@ -278,9 +278,7 @@ private void button3_Click(object sender, EventArgs e) string filename = f.FullName; byte[] rb = new byte[4096]; - System.IO.StreamReader r = new System.IO.StreamReader(filename); - string request = r.ReadToEnd(); - byte[] b = System.Text.Encoding.UTF8.GetBytes(request); + byte[] b = System.IO.File.ReadAllBytes(filename); System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient("127.0.0.1", Growl.Connector.GrowlConnector.TCP_PORT); //local //System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient("superman", Growl.Connector.GrowlConnector.TCP_PORT); //remote @@ -359,5 +357,58 @@ private void textBox2_TextChanged(object sender, EventArgs e) { this.growl.Password = textBox2.Text; } + + private void button6_Click(object sender, EventArgs e) + { + string pass = "testing"; + byte[] salt = Growl.Connector.Cryptography.HexUnencode("bbdf0d5db70ab6f0bf6a18b804a4c3c0"); + + Key key = Key.GenerateKey(pass, Cryptography.HashAlgorithmType.SHA256, Cryptography.SymmetricAlgorithmType.TripleDES); + + StringBuilder sb = new StringBuilder(); + sb.Append("Application-Name: Growl\r\n"); + sb.Append("Application-Icon: x-growl-resource://1aa5ef7f6ff637cd70b4d35463889f8e\r\n"); + sb.Append("X-Application-BundleID: com.Growl.GrowlHelperApp\r\n"); + sb.Append("Notifications-Count: 3\r\n"); + sb.Append("Sent-By: zoidberg\r\n"); + sb.Append("Origin-Machine-Name: zoidberg\r\n"); + sb.Append("Origin-Software-Name: Growl\r\n"); + sb.Append("Origin-Software-Version: 1.2\r\n"); + sb.Append("Origin-Platform-Name: Mac OS X\r\n"); + sb.Append("Origin-Platform-Version: 10.6.1\r\n"); + sb.Append("\r\n"); + sb.Append("Notification-Name: Growl update available\r\n"); + sb.Append("Notification-Display-Name: Growl update available\r\n"); + sb.Append("Notification-Enabled: Yes\r\n"); + sb.Append("\r\n"); + sb.Append("Notification-Name: User went idle\r\n"); + sb.Append("Notification-Display-Name: User went idle\r\n"); + sb.Append("Notification-Enabled: no\r\n"); + sb.Append("\r\n"); + sb.Append("Notification-Name: User returned\r\n"); + sb.Append("Notification-Display-Name: User returned\r\n"); + sb.Append("Notification-Enabled: no\r\n"); + sb.Append("\r\n"); + + string input = sb.ToString(); + byte[] b = Encoding.UTF8.GetBytes(input); + + byte[] iv = Cryptography.HexUnencode("af88602d2e17c145"); + EncryptionResult er = key.Encrypt(b, ref iv); + //EncryptionResult er = key.Encrypt(b); + + string ivHex = Cryptography.HexEncode(er.IV); + Console.WriteLine(ivHex); + + string eb = Cryptography.HexEncode(er.EncryptedBytes); + Console.WriteLine(eb); + + byte[] g = Cryptography.HexUnencode("18b337f2e8bd00254c395e358d1cd619889bd374eb48d3e74cc1c4137ddb5dc1e23d914b5a529462e9c9cb990ac38aa771ed825c172f5981f3fed7ec54a9f9cfa65bc590c0bbf58cf3e32fdda14fe568cab913f0bca3b833a34083b0093f6ac611ea1e15763d8a6d028f62cb15ebb98321316ce7578a14376fc4c4167a3d2c46838b146810d334d5578dbffa25cf3d44bb333e978afc70b4cf9367c0a5201facca5fa5a241858dde7e973dae17d0f5ef9c7fba0c752d6a935d06ecfa641e798f3ec5e6d68c4ecc8b4dc511cf431d5beef37cb2c4457a7ff1e6bc5913fbb75a67a75c483f43093302c05f5443c15fef78cea1f8efd14ac7d3a666ee60b4a17f143a4647e0aa1d7169872e34fe2b3af7bdc0f2fac5532a499ad4512b44497d67cc4b0fb0038cc0f72a153ec34e6d165b6dc46b783f5450aebc08bce0b3be9e515afd3a9022a2214ab2ceb70a2f6c8219d2741eda9e7cc4e0dffe3f7f7303491c97965127f45d24c13c3a5c03f7db3c34ab1f4b34b6fe24435e0ccfc299ee055d938596d805a70e9af10c133735cf077660412ec23673d64d283835003b6c07dadac74db61e76437b22235aa9803450c833ee422b2e5beb6754923e8bcbd9f5c6a1d8942784a62b651881ca11770080331030acb6a66a38a3e5afc37cb7c946a84f19bc90fd6cf5cd7ad95771dadc3e5dbd3e6908dc85739c774176884c2f030cad7c817769607401c9f752cad3582160eab41f216e3cb3d519576366aa1c9bce342954641281c5133826113c556f7179c2a07b284481acedf1085f7f9768fd74ee854b6c04ba04566187699f81e351e528323d50e439d0d168ecfb1500f9ef8b8f8018220f2814948940a5fda118d44ad1dc7c58c66dfbc81c66f3f229b8c57dbd30c789c8d98c2c0117140e431369c37fa23d77c8d92bfcd4fa42db3c5f86f30cba4e198a786d4591"); + Console.WriteLine(g.Length); + + byte[] d = key.Decrypt(g, iv); + Console.WriteLine(d.Length); + + } } } \ No newline at end of file diff --git a/Growl/Windows Deployment/Windows Deployment.vdproj b/Growl/Windows Deployment/Windows Deployment.vdproj index 5aac7a3..b072950 100644 --- a/Growl/Windows Deployment/Windows Deployment.vdproj +++ b/Growl/Windows Deployment/Windows Deployment.vdproj @@ -69,104 +69,104 @@ } "Entry" { - "MsmKey" = "8:_3D00667ED1C742ECA0154620D81866B2" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_17D3B941E9D34902A98DAA843A32BF16" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_17D3B941E9D34902A98DAA843A32BF16" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_E7C6D53DB81E4F82AE55D086CE3A0A2A" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_57A18C8BD9A60D54057A6809B78D7595" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_96AA9AE149184B63A3AFDB0195590AE3" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_33EF83639318416793963E45E670B67E" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_630D9489EA90CD2C3074B534C97CB646" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_2C457FD457244DCEA77841987DDCF654" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_1F654310039C492D92BEADA55B51B413" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_83CF7F65306CCE4C58253551B9963F9F" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_E246D0668B734CACAE3B59C2EB180A0C" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_E7C6D53DB81E4F82AE55D086CE3A0A2A" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_D4C296A1C1794E4DB520A5D1B4729A41" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_96AA9AE149184B63A3AFDB0195590AE3" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_33EF83639318416793963E45E670B67E" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_57A18C8BD9A60D54057A6809B78D7595" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_2C457FD457244DCEA77841987DDCF654" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_1F654310039C492D92BEADA55B51B413" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_E246D0668B734CACAE3B59C2EB180A0C" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_C81A969444FA40D9A68811A2DA513914" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" + "OwnerKey" = "8:_D4C296A1C1794E4DB520A5D1B4729A41" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" "OwnerKey" = "8:_8732B70C880242C994DC8F75A4622AC8" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" + "MsmKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" "OwnerKey" = "8:_3220F6DE738F4AA299BDA9EB196579FD" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" - "OwnerKey" = "8:_630D9489EA90CD2C3074B534C97CB646" + "MsmKey" = "8:_3D00667ED1C742ECA0154620D81866B2" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -243,6 +243,24 @@ } "Entry" { + "MsmKey" = "8:_83CF7F65306CCE4C58253551B9963F9F" + "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_83CF7F65306CCE4C58253551B9963F9F" + "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_83CF7F65306CCE4C58253551B9963F9F" + "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_8732B70C880242C994DC8F75A4622AC8" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -303,24 +321,6 @@ } "Entry" { - "MsmKey" = "8:_C81A969444FA40D9A68811A2DA513914" - "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C81A969444FA40D9A68811A2DA513914" - "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C81A969444FA40D9A68811A2DA513914" - "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_D4C296A1C1794E4DB520A5D1B4729A41" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -340,169 +340,169 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" + "OwnerKey" = "8:_8732B70C880242C994DC8F75A4622AC8" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E7C6D53DB81E4F82AE55D086CE3A0A2A" + "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_B5D5B1E6D0644CC88E19A5262F4FE5FB" + "OwnerKey" = "8:_57A18C8BD9A60D54057A6809B78D7595" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_9ED156F6CAE545DEB35B09C4EC19FAE4" + "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_96AA9AE149184B63A3AFDB0195590AE3" + "OwnerKey" = "8:_630D9489EA90CD2C3074B534C97CB646" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8BF12668A0A241E6815108B9C5BD1F4A" + "OwnerKey" = "8:_B5FFA5C1F636485B9A752E1E35E7660B" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_4FAD0DBFE59E4DF586BCA1307058B6AA" + "OwnerKey" = "8:_627E569F926AFEBF0B93376BC27BAB90" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_3D00667ED1C742ECA0154620D81866B2" + "OwnerKey" = "8:_AD4827D8C3E72A27107AB6C2D57082B4" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_33EF83639318416793963E45E670B67E" + "OwnerKey" = "8:_00D7F6410B0B0F3C32114D9AD57EA411" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_2C457FD457244DCEA77841987DDCF654" + "OwnerKey" = "8:_C1568F5A9A8BC3BD794ECFAD7BB0EBCE" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1F654310039C492D92BEADA55B51B413" + "OwnerKey" = "8:_83CF7F65306CCE4C58253551B9963F9F" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1B7FB88E9E354CABA9806D530C8AD3C4" + "OwnerKey" = "8:_E7C6D53DB81E4F82AE55D086CE3A0A2A" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_0FCC29A0AE0943A0B3497590D5B97E83" + "OwnerKey" = "8:_B5D5B1E6D0644CC88E19A5262F4FE5FB" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E246D0668B734CACAE3B59C2EB180A0C" + "OwnerKey" = "8:_9ED156F6CAE545DEB35B09C4EC19FAE4" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_D4C296A1C1794E4DB520A5D1B4729A41" + "OwnerKey" = "8:_96AA9AE149184B63A3AFDB0195590AE3" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_627E569F926AFEBF0B93376BC27BAB90" + "OwnerKey" = "8:_8BF12668A0A241E6815108B9C5BD1F4A" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_AD4827D8C3E72A27107AB6C2D57082B4" + "OwnerKey" = "8:_4FAD0DBFE59E4DF586BCA1307058B6AA" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5C2C208AABB3FA2E8CEC87BB7D5709AA" + "OwnerKey" = "8:_3D00667ED1C742ECA0154620D81866B2" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_57A18C8BD9A60D54057A6809B78D7595" + "OwnerKey" = "8:_33EF83639318416793963E45E670B67E" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_00D7F6410B0B0F3C32114D9AD57EA411" + "OwnerKey" = "8:_2C457FD457244DCEA77841987DDCF654" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_16D7851ABFBA80004387D5D33DE41F6C" + "OwnerKey" = "8:_1F654310039C492D92BEADA55B51B413" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C1568F5A9A8BC3BD794ECFAD7BB0EBCE" + "OwnerKey" = "8:_1B7FB88E9E354CABA9806D530C8AD3C4" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C81A969444FA40D9A68811A2DA513914" + "OwnerKey" = "8:_0FCC29A0AE0943A0B3497590D5B97E83" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8732B70C880242C994DC8F75A4622AC8" + "OwnerKey" = "8:_E246D0668B734CACAE3B59C2EB180A0C" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_3220F6DE738F4AA299BDA9EB196579FD" + "OwnerKey" = "8:_D4C296A1C1794E4DB520A5D1B4729A41" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_17D3B941E9D34902A98DAA843A32BF16" + "OwnerKey" = "8:_3220F6DE738F4AA299BDA9EB196579FD" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_630D9489EA90CD2C3074B534C97CB646" + "OwnerKey" = "8:_17D3B941E9D34902A98DAA843A32BF16" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_4EAD0EF3B63CBD50526CCFBA5075C993" + "OwnerKey" = "8:_381C1F8FA83929DD5429F03B1CB42D5D" "MsmSig" = "8:_UNDEFINED" } } @@ -868,23 +868,23 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3D00667ED1C742ECA0154620D81866B2" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_381C1F8FA83929DD5429F03B1CB42D5D" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" "AssemblyAsmDisplayName" = "8:Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=MSIL" "ScatterAssemblies" { - "_3D00667ED1C742ECA0154620D81866B2" + "_381C1F8FA83929DD5429F03B1CB42D5D" { "Name" = "8:Growl.CoreLibrary.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:..\\Growl.Displays.Visor\\bin\\Release\\Growl.CoreLibrary.dll" + "SourcePath" = "8:Growl.CoreLibrary.dll" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_F475FA17ED164E3B901F203257AB41CC" + "Folder" = "8:_F7B8F22C7E5A4489906A41AC00F49403" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -896,26 +896,26 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" + "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4EAD0EF3B63CBD50526CCFBA5075C993" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3D00667ED1C742ECA0154620D81866B2" { "AssemblyRegister" = "3:1" "AssemblyIsInGAC" = "11:FALSE" "AssemblyAsmDisplayName" = "8:Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=MSIL" "ScatterAssemblies" { - "_4EAD0EF3B63CBD50526CCFBA5075C993" + "_3D00667ED1C742ECA0154620D81866B2" { "Name" = "8:Growl.CoreLibrary.dll" "Attributes" = "3:512" } } - "SourcePath" = "8:Growl.CoreLibrary.dll" + "SourcePath" = "8:..\\Growl.Displays.Visor\\bin\\Release\\Growl.CoreLibrary.dll" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_F7B8F22C7E5A4489906A41AC00F49403" + "Folder" = "8:_F475FA17ED164E3B901F203257AB41CC" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -927,7 +927,7 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4FAD0DBFE59E4DF586BCA1307058B6AA" @@ -1105,6 +1105,37 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_83CF7F65306CCE4C58253551B9963F9F" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_83CF7F65306CCE4C58253551B9963F9F" + { + "Name" = "8:Growl.Connector.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Growl.Connector.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_F7B8F22C7E5A4489906A41AC00F49403" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8BF12668A0A241E6815108B9C5BD1F4A" { "AssemblyRegister" = "3:1" @@ -1291,37 +1322,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C81A969444FA40D9A68811A2DA513914" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_C81A969444FA40D9A68811A2DA513914" - { - "Name" = "8:Growl.Connector.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Growl.Connector.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_F7B8F22C7E5A4489906A41AC00F49403" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E7C6D53DB81E4F82AE55D086CE3A0A2A" { "AssemblyRegister" = "3:1" @@ -1474,14 +1474,14 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Growl for Windows" - "ProductCode" = "8:{8610AA50-283A-4343-B1FF-E47D692456FA}" - "PackageCode" = "8:{B07D4C33-3E54-453B-8203-3FF4010AB444}" + "ProductCode" = "8:{C20BBABA-8F7C-48C5-B2CF-19E7388EDC46}" + "PackageCode" = "8:{C5FD62C9-A28B-4111-96B4-DCF6654CCFE4}" "UpgradeCode" = "8:{54381489-14E3-47B6-8B92-DEB266DCF6E9}" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:2.0.00221" + "ProductVersion" = "8:2.0.00240" "Manufacturer" = "8:Growl" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"