Add Google Blogger configuration wizard panel

Adds a new radio button to specify a Google Blogger blog and a follow up
panel to prompt users to open the Google Blogger OAuth flow.
This commit is contained in:
Will Duff 2015-12-12 02:38:43 -08:00
parent bd34aecf68
commit ad482780be
17 changed files with 701 additions and 9 deletions

View File

@ -168,6 +168,13 @@ namespace OpenLiveWriter.BlogClient
}
private const string IS_SHAREPOINT_BLOG = "IsSharePointBlog";
public bool IsGoogleBloggerBlog
{
get { return Settings.GetBoolean(IS_GOOGLE_BLOGGER_BLOG, false); }
set { Settings.SetBoolean(IS_GOOGLE_BLOGGER_BLOG, value); }
}
private const string IS_GOOGLE_BLOGGER_BLOG = "IsGoogleBloggerBlog";
/// <summary>
/// Id of the weblog on the host service
/// </summary>

View File

@ -20,12 +20,16 @@ using OpenLiveWriter.BlogClient.Providers;
using OpenLiveWriter.HtmlParser.Parser;
using OpenLiveWriter.HtmlParser.Parser.FormAgent;
using OpenLiveWriter.Localization;
using Google.Apis.Blogger.v3;
namespace OpenLiveWriter.BlogClient.Clients
{
[BlogClient("BloggerAtom", "Atom")]
public class BloggerAtomClient : AtomClient
{
public static string PicasaServiceScope = "https://picasaweb.google.com/data";
public static string BloggerServiceScope = BloggerService.Scope.Blogger;
public BloggerAtomClient(Uri postApiUrl, IBlogCredentialsAccessor credentials)
: base(AtomProtocolVersion.V10DraftBlogger, postApiUrl, credentials)
{

View File

@ -457,6 +457,11 @@
Identifier="BloggerError"
Text="Blogger returned the following error:&#xD;&#xA;&#xD;&#xA;{0}"
comment:Text="{0} - an error message" />
<Message
Identifier="GoogleBloggerLoginRequired"
Type="Warning"
Title="Open Live Writer"
Text="Sign in to Google Blogger to continue." />
<Message
Identifier="UnexpectedErrorLogin"
Text="An unexpected error has occurred while attempting to log in:&#xD;&#xA;&#xD;&#xA;{0}"
@ -524,7 +529,7 @@
Identifier="VideoLoginRequired"
Type="Warning"
Title="Open Live Writer"
Text="Sign in and select a video to continue." />
Text="Sign in and select a video to continue." />
<Message
Identifier="WordpressHomepageWrong"
Type="Warning"

View File

@ -34,6 +34,7 @@ namespace OpenLiveWriter.Localization
FtpServerUnavailable,
FtpSettingsRequired,
GoogleAuthTokenNotFound,
GoogleBloggerLoginRequired,
GuestNotSupported,
HomepageUrlInvalid,
HomepageUrlRequired,

View File

@ -2796,6 +2796,12 @@ Check the file name and try again.</value>
<data name="DisplayMessage.GoogleAuthTokenNotFound.Text" xml:space="preserve">
<value>The server did not respond with the expected authorization token.</value>
</data>
<data name="DisplayMessage.GoogleBloggerLoginRequired.Text" xml:space="preserve">
<value>Sign in to Google Blogger to continue.</value>
</data>
<data name="DisplayMessage.GoogleBloggerLoginRequired.Title" xml:space="preserve">
<value>Open Live Writer</value>
</data>
<data name="DisplayMessage.GuestNotSupported.Text" xml:space="preserve">
<value>Using Open Live Writer from the guest account is not supported.</value>
</data>

View File

@ -360,6 +360,9 @@
<data name="DisplayMessage.InvalidWebImage.Type" xml:space="preserve">
<value>Asterisk</value>
</data>
<data name="DisplayMessage.GoogleBloggerLoginRequired.Type" xml:space="preserve">
<value>Warning</value>
</data>
<data name="DisplayMessage.LocalDeleteConfirmation.Buttons" xml:space="preserve">
<value>YesNo</value>
</data>

View File

@ -395,7 +395,7 @@ namespace OpenLiveWriter.Localization
/// </summary>
BlogPluginsDescription,
/// <summary>
/// Blogger, TypePad, and more
/// TypePad and more
/// </summary>
BlogServiceNames,
/// <summary>
@ -1103,6 +1103,14 @@ namespace OpenLiveWriter.Localization
/// </summary>
CWSharePointUseSystemLogin,
/// <summary>
/// Provide Google Blogger Login
/// </summary>
CWGoogleBloggerTitle,
/// <summary>
/// To configure Google Blogger please sign in.
/// </summary>
CWGoogleBloggerDescription,
/// <summary>
/// &Microsoft Account:
/// </summary>
CWSpacesUsername,
@ -5203,6 +5211,10 @@ namespace OpenLiveWriter.Localization
/// </summary>
WizardBlogTypeConfigureTo,
/// <summary>
/// &Google Blogger
/// </summary>
WizardBlogTypeGoogleBlogger,
/// <summary>
/// &Other services
/// </summary>
WizardBlogTypeOther,

View File

@ -59,6 +59,7 @@ WizardBlogTypeWelcome,"Many popular blog services work with {0}.","{0} - Long pr
WizardBlogTypeWhatBlogType,What blog service do you use?,
WizardBlogTypeConfigureTo,Configure {0} to publish to:,"{0} - Long product name, i.e. ""Open Live Writer""; followed by a choice of two options: ""SharePoint blog"" or ""Another blog service"""
WizardBlogTypeSharePoint,&SharePoint,
WizardBlogTypeGoogleBlogger,&Google Blogger,
WizardBlogTypeOther,&Other services,
Options,Options,
AllowAutoUpdate,"Automatically &update account information (categories, links, capabilities, and provider extensions)",
@ -365,6 +366,8 @@ CWSharePointTitle,Configure {0} for a SharePoint blog,{0} - Writer
CWSharePointTitle2,Provide SharePoint Blog Login,
CWSharePointText2,Enter the login required to publish to your SharePoint blog.,
CWSharePointUseSystemLogin,Use my &Windows user name and password,
CWGoogleBloggerTitle,Provide Google Blogger Login,
CWGoogleBloggerDescription,To configure Google Blogger please sign in.,
CWTitle,Add Blog Wizard,Caption of the Add Blog Wizard window.
CWProgressHeader,Setting up your blog account,
ProgressDownloadingEditingTemplate,Downloading editing template...,
@ -1329,7 +1332,7 @@ PostPageFilter,Filter {0}, {0} - Posts or Pages
LiveIDPrivacy,Privacy policy,
ForgotMyPassword,Forgot my password,
BrowseForFile,Browse for file,Tooltip over the button in the insert video from file dialog that opens an Open File Dialog when clicked,
BlogServiceNames,"Blogger, TypePad, and more",
BlogServiceNames,"TypePad and more",
FindCategory,Find category,
Alignment,Alignment,Tooltip for image alignment dropdown,
CropPane,Image crop pane,

Can't render this file because it has a wrong number of fields in line 52.

View File

@ -460,7 +460,7 @@
<comment>From the Weblog | Edit Weblog Settings | Plugins preferences panel</comment>
</data>
<data name="BlogServiceNames" xml:space="preserve">
<value>Blogger, TypePad, and more</value>
<value>TypePad and more</value>
</data>
<data name="BrightnessAdjust" xml:space="preserve">
<value>Contrast</value>
@ -1066,6 +1066,12 @@
<data name="CWSharePointUseSystemLogin" xml:space="preserve">
<value>Use my &amp;Windows user name and password</value>
</data>
<data name="CWGoogleBloggerTitle" xml:space="preserve">
<value>Provide Google Blogger Login</value>
</data>
<data name="CWGoogleBloggerDescription" xml:space="preserve">
<value>To configure Google Blogger please sign in.</value>
</data>
<data name="CWSpacesUsername" xml:space="preserve">
<value>&amp;Microsoft Account ID:</value>
</data>
@ -4497,6 +4503,9 @@ This might take a while.</value>
<value>Configure {0} to publish to:</value>
<comment>{0} - Long product name, i.e. "Open Live Writer"; followed by a choice of two options: "SharePoint blog" or "Another blog service"</comment>
</data>
<data name="WizardBlogTypeGoogleBlogger" xml:space="preserve">
<value>&amp;Google Blogger</value>
</data>
<data name="WizardBlogTypeOther" xml:space="preserve">
<value>&amp;Other services</value>
</data>

View File

@ -35,6 +35,7 @@ namespace OpenLiveWriter.PostEditor.Configuration
tempSettings.IsNewWeblog = false;
tempSettings.IsSpacesBlog = blogSettings.IsSpacesBlog;
tempSettings.IsSharePointBlog = blogSettings.IsSharePointBlog;
tempSettings.IsGoogleBloggerBlog = blogSettings.IsGoogleBloggerBlog;
tempSettings.HostBlogId = blogSettings.HostBlogId;
tempSettings.BlogName = blogSettings.BlogName;
tempSettings.HomepageUrl = blogSettings.HomepageUrl;
@ -83,6 +84,7 @@ namespace OpenLiveWriter.PostEditor.Configuration
settings.HostBlogId = this.HostBlogId;
settings.IsSpacesBlog = this.IsSpacesBlog;
settings.IsSharePointBlog = this.IsSharePointBlog;
settings.IsGoogleBloggerBlog = this.IsGoogleBloggerBlog;
settings.BlogName = this.BlogName;
settings.HomepageUrl = this.HomepageUrl;
settings.ForceManualConfig = this.ForceManualConfig;
@ -254,6 +256,18 @@ namespace OpenLiveWriter.PostEditor.Configuration
}
}
public bool IsGoogleBloggerBlog
{
get
{
return _isGoogleBloggerBlog;
}
set
{
_isGoogleBloggerBlog = value;
}
}
public string HostBlogId
{
get
@ -605,6 +619,7 @@ namespace OpenLiveWriter.PostEditor.Configuration
private bool? _savePassword;
private bool _isSpacesBlog = false;
private bool _isSharePointBlog = false;
private bool _isGoogleBloggerBlog = false;
private string _hostBlogId = String.Empty;
private string _blogName = String.Empty;
private string _homePageUrl = String.Empty;
@ -665,6 +680,7 @@ namespace OpenLiveWriter.PostEditor.Configuration
_savePassword = sourceSettings._savePassword;
_isSpacesBlog = sourceSettings._isSpacesBlog;
_isSharePointBlog = sourceSettings._isSharePointBlog;
_isGoogleBloggerBlog = sourceSettings._isGoogleBloggerBlog;
_hostBlogId = sourceSettings._hostBlogId;
_blogName = sourceSettings._blogName;
_homePageUrl = sourceSettings._homePageUrl;

View File

@ -227,6 +227,18 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
_authenticationRequired = showAuthenticationStep;
}
private void AddGoogleBloggerOAuthSubStep()
{
addWizardSubStep(
new WizardSubStep(new WeblogConfigurationWizardPanelGoogleBloggerAuthentication(),
null,
new DisplayCallback(OnBasicInfoDisplayed),
new VerifyStepCallback(OnValidatePanel),
new NextCallback(OnGoogleBloggerOAuthCompleted),
null,
new BackCallback(OnGoogleBloggerOAuthBack)));
}
private void AddConfirmationStep()
{
addWizardStep(
@ -324,6 +336,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
// set the user's choice
_temporarySettings.IsSharePointBlog = panelBlogType.IsSharePointBlog;
_temporarySettings.IsGoogleBloggerBlog = panelBlogType.IsGoogleBloggerBlog;
// did this bootstrap a custom account wizard?
_providerAccountWizard = panelBlogType.ProviderAccountWizard;
@ -333,6 +346,10 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
{
AddSharePointBasicInfoSubStep(false);
}
else if (_temporarySettings.IsGoogleBloggerBlog)
{
AddGoogleBloggerOAuthSubStep();
}
else
{
AddBasicInfoSubStep();
@ -514,6 +531,17 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
_authenticationStepAdded = false;
}
private void OnGoogleBloggerOAuthCompleted(Object stepControl)
{
OnBasicInfoAndAuthenticationCompleted((IAccountBasicInfoProvider)stepControl, new PerformBlogAutoDetection(PerformWeblogAndSettingsAutoDetectionSubStep));
}
private void OnGoogleBloggerOAuthBack(Object stepControl)
{
var panel = (WeblogConfigurationWizardPanelGoogleBloggerAuthentication)stepControl;
panel.CancelAuthorization();
}
private void OnWeblogAndSettingsAutoDetectionCompleted(Object stepControl)
{
// if we weren't able to identify a specific weblog

View File

@ -30,6 +30,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
OtherBasicInfo = 33,
SelectProvider = 40,
SharePointAuth = 41,
GoogleBloggerAuth = 42,
SelectBlog = 50,
SelectImageEndPoint = 60,
Confirm = 80,

View File

@ -25,6 +25,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
private System.Windows.Forms.Label labelWelcomeText;
private System.Windows.Forms.Panel panelRadioButtons;
private System.Windows.Forms.RadioButton radioButtonSharePoint;
private System.Windows.Forms.RadioButton radioButtonBlogger;
private System.Windows.Forms.RadioButton radioButtonOther;
private System.Windows.Forms.Label labelOtherDesc;
private System.Windows.Forms.RadioButton radioButtonWordpress;
@ -47,6 +48,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
labelHeader.Text = Res.Get(StringId.WizardBlogTypeWhatBlogType);
labelWelcomeText.Text = Res.Get(StringId.WizardBlogTypeWelcome);
radioButtonSharePoint.Text = Res.Get(StringId.WizardBlogTypeSharePoint);
radioButtonBlogger.Text = Res.Get(StringId.WizardBlogTypeGoogleBlogger);
radioButtonOther.Text = Res.Get(StringId.WizardBlogTypeOther);
radioButtonWordpress.Text = Res.Get(StringId.CWWelcomeWP);
@ -78,6 +80,8 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
comboBoxSelectWeblogType.Items.Add(new WeblogType(serviceName));
}
comboBoxSelectWeblogType.Items.Add(new WeblogType(radioButtonBlogger));
// add "another weblog type" entry
comboBoxSelectWeblogType.Items.Add(new WeblogType(radioButtonOther));
@ -99,8 +103,8 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
comboBoxSelectWeblogType.SelectedIndexChanged += new EventHandler(UserChangedSelectionHandler);
radioButtonWordpress.CheckedChanged += new EventHandler(UserChangedSelectionHandler);
radioButtonSharePoint.CheckedChanged += new EventHandler(UserChangedSelectionHandler);
radioButtonBlogger.CheckedChanged += new EventHandler(UserChangedSelectionHandler);
radioButtonOther.CheckedChanged += new EventHandler(UserChangedSelectionHandler);
}
public override void NaturalizeLayout()
@ -117,12 +121,13 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
MaximizeWidth(radioButtonWordpress);
MaximizeWidth(radioButtonSharePoint);
MaximizeWidth(radioButtonBlogger);
MaximizeWidth(radioButtonOther);
MaximizeWidth(labelOtherDesc);
using (new AutoGrow(panelRadioButtons, AnchorStyles.Bottom, true))
{
LayoutHelper.NaturalizeHeightAndDistribute(3, radioButtonWordpress, radioButtonSharePoint, radioButtonOther);
LayoutHelper.NaturalizeHeightAndDistribute(3, radioButtonWordpress, radioButtonSharePoint, radioButtonBlogger, radioButtonOther);
labelOtherDesc.Top = radioButtonOther.Bottom;
}
}
@ -162,6 +167,21 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
}
}
public bool IsGoogleBloggerBlog
{
get
{
if (panelRadioButtons.Visible)
{
return radioButtonBlogger.Checked;
}
else
{
return SelectedWeblog.RadioButton == radioButtonBlogger;
}
}
}
public IBlogProviderAccountWizardDescription ProviderAccountWizard
{
get
@ -293,6 +313,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
this.panelRadioButtons = new System.Windows.Forms.Panel();
this.radioButtonWordpress = new System.Windows.Forms.RadioButton();
this.radioButtonSharePoint = new System.Windows.Forms.RadioButton();
this.radioButtonBlogger = new System.Windows.Forms.RadioButton();
this.radioButtonOther = new System.Windows.Forms.RadioButton();
this.labelOtherDesc = new System.Windows.Forms.Label();
this.panelComboBox = new System.Windows.Forms.Panel();
@ -326,6 +347,7 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
| System.Windows.Forms.AnchorStyles.Right)));
this.panelRadioButtons.Controls.Add(this.radioButtonWordpress);
this.panelRadioButtons.Controls.Add(this.radioButtonSharePoint);
this.panelRadioButtons.Controls.Add(this.radioButtonBlogger);
this.panelRadioButtons.Controls.Add(this.radioButtonOther);
this.panelRadioButtons.Controls.Add(this.labelOtherDesc);
this.panelRadioButtons.Location = new System.Drawing.Point(20, 88);
@ -349,7 +371,15 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
this.radioButtonSharePoint.Size = new System.Drawing.Size(104, 24);
this.radioButtonSharePoint.TabIndex = 2;
this.radioButtonSharePoint.Text = "Share&Point weblog";
//
//
// radioButtonBlogger
//
this.radioButtonBlogger.Location = new System.Drawing.Point(0, 72);
this.radioButtonBlogger.Name = "radioButtonBlogger";
this.radioButtonBlogger.Size = new System.Drawing.Size(104, 24);
this.radioButtonBlogger.TabIndex = 3;
this.radioButtonBlogger.Text = "&Google Blogger";
//
// radioButtonOther
//
this.radioButtonOther.Location = new System.Drawing.Point(0, 48);
@ -366,8 +396,8 @@ namespace OpenLiveWriter.PostEditor.Configuration.Wizard
this.labelOtherDesc.Name = "labelOtherDesc";
this.labelOtherDesc.Size = new System.Drawing.Size(332, 40);
this.labelOtherDesc.TabIndex = 5;
this.labelOtherDesc.Text = "Blogger, WordPress, TypePad, all others";
//
this.labelOtherDesc.Text = "TypePad and others";
//
// panelComboBox
//
this.panelComboBox.Controls.Add(this.comboBoxSelectWeblogType);

View File

@ -0,0 +1,243 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Threading.Tasks;
using OpenLiveWriter.BlogClient;
using OpenLiveWriter.BlogClient.Clients;
using OpenLiveWriter.CoreServices;
using OpenLiveWriter.CoreServices.Layout;
using OpenLiveWriter.Extensibility.BlogClient;
using OpenLiveWriter.Localization;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Blogger.v3;
using Google.Apis.Blogger.v3.Data;
using Google.Apis.Services;
using System.Threading;
using OpenLiveWriter.BlogClient.Detection;
namespace OpenLiveWriter.PostEditor.Configuration.Wizard
{
/// <summary>
/// Summary description for WeblogConfigurationWizardPanelAuthentication.
/// </summary>
internal class WeblogConfigurationWizardPanelGoogleBloggerAuthentication : WeblogConfigurationWizardPanel, IAccountBasicInfoProvider
{
private System.Windows.Forms.Label labelDescription;
private System.Windows.Forms.Button buttonLogin;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private UserCredential _userCredentials;
private BlogList _blogList;
private CancellationTokenSource _cancellationTokenSource;
public WeblogConfigurationWizardPanelGoogleBloggerAuthentication()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
labelHeader.Text = Res.Get(StringId.CWGoogleBloggerTitle);
labelDescription.Text = Res.Get(StringId.CWGoogleBloggerDescription);
buttonLogin.Text = Res.Get(StringId.Login);
}
private async void buttonLogin_Click(object sender, EventArgs e)
{
buttonLogin.Enabled = false;
try
{
_cancellationTokenSource = new CancellationTokenSource();
_userCredentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets()
{
ClientId = "clientId",
ClientSecret = "clientSecret"
},
new List<string>() { BloggerAtomClient.BloggerServiceScope, BloggerAtomClient.PicasaServiceScope },
"user",
_cancellationTokenSource.Token);
_cancellationTokenSource = null;
}
finally
{
buttonLogin.Enabled = true;
}
}
private async Task ListUserBlogs()
{
BloggerService service = new BloggerService(new BaseClientService.Initializer()
{
HttpClientInitializer = _userCredentials
});
_blogList = await service.Blogs.ListByUser("self").ExecuteAsync();
}
public void CancelAuthorization()
{
if (_cancellationTokenSource != null)
{
_cancellationTokenSource.Cancel();
}
}
public override void NaturalizeLayout()
{
if (!DesignMode)
{
MaximizeWidth(labelDescription);
LayoutHelper.NaturalizeHeight(labelDescription);
LayoutHelper.DistributeVertically(10, false, labelDescription, buttonLogin);
}
}
public override ConfigPanelId? PanelId
{
get { return ConfigPanelId.GoogleBloggerAuth; }
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.buttonLogin = new System.Windows.Forms.Button();
this.labelDescription = new System.Windows.Forms.Label();
this.panelMain.SuspendLayout();
this.SuspendLayout();
//
// panelMain
//
this.panelMain.Controls.Add(this.buttonLogin);
this.panelMain.Controls.Add(this.labelDescription);
//
// buttonLogin
//
this.buttonLogin.AutoSize = true;
this.buttonLogin.Location = new System.Drawing.Point(20, 0);
this.buttonLogin.FlatStyle = FlatStyle.System;
this.buttonLogin.Name = "buttonLogin";
this.buttonLogin.Size = new System.Drawing.Size(168, 13);
this.buttonLogin.TabIndex = 0;
this.buttonLogin.Text = "Sign in";
this.buttonLogin.Click += buttonLogin_Click;
//
// labelDescription
//
this.labelDescription.FlatStyle = FlatStyle.System;
this.labelDescription.Location = new System.Drawing.Point(20, 0);
this.labelDescription.Name = "labelDescription";
this.labelDescription.Size = new System.Drawing.Size(360, 24);
this.labelDescription.TabIndex = 1;
this.labelDescription.Text = "To configure Google Blogger please sign in.";
//
// WeblogConfigurationWizardPanelGoogleBloggerAuthentication
//
this.Name = "WeblogConfigurationWizardPanelGoogleBloggerAuthentication";
this.panelMain.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public override bool ValidatePanel()
{
if (_userCredentials == null || _userCredentials.Token == null)
{
ShowValidationError(buttonLogin, MessageId.GoogleBloggerLoginRequired);
return false;
}
return true;
}
public bool IsDirty(TemporaryBlogSettings settings)
{
return false;
// TODO:OLW
// return Credentials.OAuthCredentials != settings.Credentials.OAuthCredentials;
}
public IBlogProviderAccountWizardDescription ProviderAccountWizard
{
set { }
}
public string AccountId
{
set { }
}
public string HomepageUrl
{
get { return string.Empty; }
set { }
}
public bool SavePassword
{
get { return true; }
set { }
}
public bool ForceManualConfiguration
{
get { return false; }
set { }
}
public IBlogCredentials Credentials
{
get
{
TemporaryBlogCredentials credentials = new TemporaryBlogCredentials();
credentials.Username = "user";
if (_userCredentials != null)
{
// TODO:OLW
//credentials.GoogleBloggerToken = _userCredentials;
credentials.Password = _userCredentials.Token.AccessToken;
credentials.SetCustomValue("RefreshToken", _userCredentials.Token.RefreshToken);
credentials.SetCustomValue("Scope", _userCredentials.Token.Scope);
credentials.SetCustomValue("Issued", _userCredentials.Token.Issued.ToBinary().ToString());
}
return credentials;
}
set
{
// TODO:OLW
}
}
public BlogInfo BlogAccount
{
get { return null; }
}
}
}

View File

@ -0,0 +1,238 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used forserialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="panelMain.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="panelMain.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="panelMain.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="panelMain.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="panelMain.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Family</value>
</data>
<data name="panelMain.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>8, 8</value>
</data>
<data name="labelPassword.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="labelPassword.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelPassword.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="textBoxPassword.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="textBoxPassword.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="textBoxPassword.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="textBoxUsername.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="textBoxUsername.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="textBoxUsername.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelUsername.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="labelUsername.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelUsername.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelTitle.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="labelTitle.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelTitle.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelText.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="labelText.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="labelText.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="cbUseSystemLogin.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="cbUseSystemLogin.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="cbUseSystemLogin.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="panelCustomLogin.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="panelCustomLogin.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="panelCustomLogin.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="panelCustomLogin.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>8, 8</value>
</data>
<data name="panelCustomLogin.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="panelCustomLogin.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="checkBoxSavePassword.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="checkBoxSavePassword.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="checkBoxSavePassword.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>80</value>
</data>
<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>(Default)</value>
</data>
<data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Private</value>
</data>
<data name="$this.Name">
<value>WeblogConfigurationWizardPanelSharePointAuthentication</value>
</data>
<data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>8, 8</value>
</data>
</root>

View File

@ -7,6 +7,8 @@
<RootNamespace>OpenLiveWriter.PostEditor</RootNamespace>
<ProjectGuid>{D6C9A393-E0B8-4548-B84B-F8B6FE2A5645}</ProjectGuid>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<ItemGroup>
<Reference Include="Accessibility" />
@ -22,10 +24,50 @@
<HintPath>..\packages\DeltaCompressionDotNet.1.0.0\lib\net45\DeltaCompressionDotNet.PatchApi.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis, Version=1.9.2.27817, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.1.9.2\lib\net40\Google.Apis.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis.Auth, Version=1.9.2.27817, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.9.2\lib\net40\Google.Apis.Auth.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.9.2.27820, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.9.2\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis.Blogger.v3, Version=1.9.2.48, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Blogger.v3.1.9.2.480\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Blogger.v3.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis.Core, Version=1.9.2.27816, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Core.1.9.2\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Google.Apis.PlatformServices, Version=1.9.2.27818, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.1.9.2\lib\net40\Google.Apis.PlatformServices.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\squirrel.windows.1.2.1\lib\Net45\ICSharpCode.SharpZipLib.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="log4net, Version=1.2.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.3\lib\net40-full\log4net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Mono.Cecil, Version=0.9.6.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\Mono.Cecil.0.9.6.1\lib\net45\Mono.Cecil.dll</HintPath>
<Private>True</Private>
@ -42,6 +84,10 @@
<HintPath>..\packages\Mono.Cecil.0.9.6.1\lib\net45\Mono.Cecil.Rocks.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NuGet.Squirrel, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\squirrel.windows.1.2.1\lib\Net45\NuGet.Squirrel.dll</HintPath>
<Private>True</Private>
@ -58,6 +104,17 @@
<Reference Include="System.Data" />
<Reference Include="System.Design" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Services" />
<Reference Include="System.Windows.Forms" />
@ -141,6 +198,10 @@
<Project>{699FB638-CE02-48D7-8078-30A7939C5BCB}</Project>
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
</ProjectReference>
<Reference Include="Zlib.Portable, Version=1.11.0.0, Culture=neutral, PublicKeyToken=431cba815f6a8b5b, processorArchitecture=MSIL">
<HintPath>..\packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\GlobalAssemblyInfo.cs" />
@ -270,6 +331,9 @@
<Compile Include="Configuration\Wizard\WeblogConfigurationWizardPanelSelectProvider.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Configuration\Wizard\WeblogConfigurationWizardPanelGoogleBloggerAuthentication.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Configuration\Wizard\WeblogConfigurationWizardPanelSharePointAuthentication.cs">
<SubType>UserControl</SubType>
</Compile>
@ -989,6 +1053,10 @@
<DependentUpon>WeblogConfigurationWizardPanelSelectProvider.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Configuration\Wizard\WeblogConfigurationWizardPanelGoogleBloggerAuthentication.resx">
<DependentUpon>WeblogConfigurationWizardPanelGoogleBloggerAuthentication.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Configuration\Wizard\WeblogConfigurationWizardPanelSharePointAuthentication.resx">
<DependentUpon>WeblogConfigurationWizardPanelSharePointAuthentication.cs</DependentUpon>
<SubType>Designer</SubType>
@ -1612,4 +1680,11 @@
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
</Target>
</Project>

View File

@ -1,7 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="DeltaCompressionDotNet" version="1.0.0" targetFramework="net452" />
<package id="Google.Apis" version="1.9.2" targetFramework="net452" />
<package id="Google.Apis.Auth" version="1.9.2" targetFramework="net452" />
<package id="Google.Apis.Blogger.v3" version="1.9.2.480" targetFramework="net452" />
<package id="Google.Apis.Core" version="1.9.2" targetFramework="net452" />
<package id="log4net" version="2.0.3" targetFramework="net452" />
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net452" />
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net452" />
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net452" />
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net452" />
<package id="Mono.Cecil" version="0.9.6.1" targetFramework="net452" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
<package id="Splat" version="1.6.2" targetFramework="net452" />
<package id="squirrel.windows" version="1.2.1" targetFramework="net452" />
<package id="Zlib.Portable.Signed" version="1.11.0" targetFramework="net452" />
</packages>