167 Commits

Author SHA1 Message Date
swcs 0209d1a5b1 5.0 release 2019-04-05 14:26:19 +02:00
swcs aade66eef8 update dependencies 2019-04-05 14:12:31 +02:00
swcs 81394b9171 make Explore method internal for now 2019-04-05 14:09:05 +02:00
swcs c3a9f921eb add description to user account 2018-07-17 00:33:35 +02:00
swcs 9890a9c8b4 use a new PocketExploreItem model for the explore results 2018-07-16 01:34:15 +02:00
swcs bfc63bc55d fix some explore bugs 2018-07-15 11:50:23 +02:00
swcs 5d1f05f91d forgot new file -.- 2018-07-14 23:27:12 +02:00
swcs eb89784117 add Explore method 2018-07-14 23:26:57 +02:00
swcs ab3b532e30 merge httpclient+restparserclient; add RequestAsString method 2018-07-14 22:10:44 +02:00
swcs 960fd56d6c oops 2018-07-14 15:10:47 +02:00
swcs 0dff3dc3de delete tag action 2018-07-14 14:10:03 +02:00
swcs a0fce1a5fb RenameTag does not accept an item Id 2018-07-14 13:59:50 +02:00
swcs 4260a3f10d Merge branch 'master' of https://github.com/ceee/PocketSharp 2018-07-14 13:58:13 +02:00
swcs 284b7d16c1 hm ooook 2018-07-14 13:57:39 +02:00
swcs 6bd23cb4fe trending methods do not require a GUID 2018-07-12 11:34:07 +02:00
swcs 000c821661 fix json converter bug 2018-07-12 11:30:20 +02:00
swcs 281034a16d add article suggestions 2018-07-03 12:20:16 +02:00
swcs 8248f90b5b remove JSON prop from PocketItem and introduce an AfterRequest action with the passed raw response 2018-07-02 16:41:18 +02:00
swcs 7edc82d726 complete new requests for trending 2018-07-02 16:25:09 +02:00
swcs 00b44e917e basic implementation of trending articles & topics 2018-07-02 15:56:57 +02:00
swcs e6e242f7c1 get more detailled user data 2018-04-24 13:18:15 +02:00
swcs 1c2c85ad05 method to get a new GUID from Pocket 2018-04-09 12:34:52 +02:00
swcs ed087ffdf5 update tests 2018-04-09 12:18:45 +02:00
swcs e3b571d98b update readme to reflect changet to .NET Standard 2018-04-05 16:11:40 +02:00
swcs 2db1dadc38 add nuspec file 2018-04-05 16:09:08 +02:00
swcs f9e68da5ef migrate to .NET Standard 2.0 and remove old examples 2018-04-05 16:07:35 +02:00
swcs 18202a16de reconfigure projects and update deps 2018-04-05 15:58:02 +02:00
swcs 5e04409310 remove .nuget files 2018-04-05 15:43:19 +02:00
swcs aa51acc5de remove .vs files 2018-04-05 15:41:12 +02:00
swcs 48e75d21c0 add pocket video type 2016-02-27 18:51:59 +01:00
swcs bc2b17cc20 Merge pull request #34 from fujiy/FixEquals
Fix PocketItem.Equals(object obj). #32
2016-02-21 23:30:35 +01:00
swcs d227cc535f add failing equality test case (see issue #32) 2016-02-21 23:28:57 +01:00
swcs 49436e0aaa add equality check unit test 2016-02-21 13:44:00 +01:00
swcs c52bffcd95 remove INPC and add item ID to images + videos 2016-02-21 13:43:41 +01:00
Felipe Fujiy Pessoto a1a56668a0 Fix PocketItem.Equals(object obj). #32 2016-02-20 23:36:46 -03:00
swcs 4998db08a6 update changelog/readme 2015-12-05 17:37:21 +01:00
swcs ded764c9cd forget fodyweavers file 2015-12-05 17:30:28 +01:00
swcs 80f8a2231e update packages + remove decompression from HttpClient (2.2) 2015-12-05 17:30:18 +01:00
swcs b3a794436a update license 2015-01-01 19:33:50 +01:00
swcs 9c597db11c add gitattributes 2014-12-04 18:11:04 +01:00
swcs b16339db98 Update README.md 2014-11-17 18:00:22 +01:00
swcs 459d034aa2 merge to master 2014-08-28 14:22:57 +02:00
swcs b8d211e151 update changelog 2014-08-28 14:15:16 +02:00
swcs c31b771cdb fix datetime conversion issue 2014-08-28 14:14:40 +02:00
swcs fc7d2a7eaf assembly version 2014-07-27 15:20:25 +02:00
swcs 77af7cf20e Revert "sliiim"
This reverts commit 816e06269f.
2014-07-27 15:19:14 +02:00
swcs b284cfc7cc assembly version 2014-07-27 15:18:57 +02:00
swcs 51aa7c9fdf assembly version 2014-07-27 15:17:58 +02:00
swcs 451190daee LOL 2014-07-27 15:17:57 +02:00
swcs 9af20d05dc fixes #28
Fix StackOverflow bug in PocketItem equality overload
2014-07-27 15:17:56 +02:00
swcs f62820e069 convert all datetimes to UTC+0 2014-07-27 15:17:55 +02:00
swcs 816e06269f sliiim 2014-07-27 15:17:54 +02:00
swcs e0f96a092c assembly version 2014-07-27 15:16:39 +02:00
swcs 0301bbaf10 LOL 2014-07-27 13:03:33 +02:00
swcs 5266f220e9 fixes #28
Fix StackOverflow bug in PocketItem equality overload
2014-07-27 13:01:53 +02:00
swcs c83971b4cc convert all datetimes to UTC+0 2014-07-21 16:37:30 +02:00
swcs 1567709ace Merge remote-tracking branch 'origin/master' into simple 2014-07-21 16:24:30 +02:00
swcs 342f16fb8e convert timestamps to UTC+-0 (critical fix) 2014-07-21 16:23:59 +02:00
swcs 423be2df5f Merge remote-tracking branch 'origin/master' into simple 2014-07-18 11:58:08 +02:00
swcs 1605740107 fixes #27
Implement WebAuthenticationBroker-view toggle
see: http://getpocket.com/developer/docs/getstarted/windows8
2014-07-18 11:54:47 +02:00
swcs b7b92d87ed sliiim 2014-07-02 15:31:38 +02:00
swcs 01c36a047a flag for caching last HTTP response 2014-07-01 17:10:14 +02:00
swcs 140e645e86 bugfix 2014-06-25 14:41:42 +02:00
swcs 97919cdd18 supi dupi force param 2014-06-18 18:58:43 +02:00
swcs 761d670c65 update docs and changelog 2014-06-17 11:11:41 +02:00
swcs 1ca93bf07f update version 2014-06-17 10:46:00 +02:00
swcs 556e8004f3 fix Action parameter "url", so batch adding is working now 2014-06-17 10:45:24 +02:00
swcs 7cad855f9c return correct response status for "Send" 2014-06-17 10:14:26 +02:00
swcs 366908a070 fix json converter bug 2014-05-27 00:38:48 +02:00
swcs d141c7b255 fix deserializer bug 2014-05-11 23:07:49 +02:00
swcs 8531d20162 make PocketClient disposable 2014-05-11 22:59:06 +02:00
swcs 4f42ed719a separate HttpClient for parser API 2014-05-11 22:54:44 +02:00
swcs b46cc56362 implement ParserAPI func 2014-05-11 22:50:06 +02:00
swcs 500bd1c65d itemID prop for Tags; PocketArticle model 2014-05-11 22:26:08 +02:00
swcs a207ca7ca4 ConvertJsonToList 2014-05-03 18:54:19 +02:00
swcs 07c9f06f75 add IComparable and tostring/gethashcode to PocketItem 2014-05-02 17:59:26 +02:00
swcs a1ff132ba9 change assemblyversion 2014-05-01 18:14:17 +02:00
swcs 82896d6fb4 prevent creation of Lists and use IEnumerable where possible 2014-05-01 17:56:18 +02:00
swcs 36683c7402 add tags as string 2014-04-20 12:36:20 +02:00
swcs 4e5a8ab096 remove internal search and use official by Pocket 2014-04-17 10:26:59 +02:00
swcs 47baa0fd97 update docs 2014-04-05 11:44:03 +02:00
swcs ec25258de9 assembly version 2014-04-03 12:00:31 +02:00
swcs 6999185c96 remove unnecessary action in tests 2014-04-03 11:50:12 +02:00
swcs 7669d8880e first running version of new package 2014-04-03 11:45:00 +02:00
swcs 38b6a62686 add new test 2014-04-02 16:57:28 +02:00
swcs 0f7f626d15 update readme 2014-03-13 21:28:22 +01:00
swcs 81f099d419 update version 2014-03-13 21:25:04 +01:00
Stephen Erstad ec006b298d Added test for Json property for PocketItem
Tested that the Json property is set on the retrieved PocketItems and
that they represent a JSON object
2014-03-04 22:35:50 -06:00
Stephen Erstad 4fa0ee29fe Raw JSON on PocketItem Model
Implementation of setting the raw JSON representation of a PocketItem to
the PocketSharp model
2014-03-04 22:12:08 -06:00
swcs c21abd5f21 try to normalize URIs retrieved in video array; update tests; 2014-02-23 21:03:55 +01:00
swcs facba2894d update packages solution-wide 2014-02-21 23:50:24 +01:00
swcs 585c203f9a fix PocketAction conversion exception when no ID is given; fixes #20 2014-02-17 23:30:15 +01:00
swcs 07357b9327 add wp7 project 2014-02-11 21:55:22 +01:00
swcs 75e6a23905 update dependencies 2014-02-10 22:48:35 +01:00
swcs 44c4bc11db update nuspec file 2014-02-07 14:31:09 +01:00
swcs d3d8937c60 update changelog 2014-02-07 14:24:25 +01:00
swcs b2113eb065 allow toggle for disabling mobile param 2014-02-07 14:22:52 +01:00
swcs 13664c4201 fixes #18 - new registration via redirect 2014-02-07 14:12:09 +01:00
swcs 13c98e2d59 fixes #17 2014-02-07 14:10:12 +01:00
swcs 7b14044c53 password has to be at least 6 chars long 2014-02-06 13:28:28 +01:00
swcs 0be1efb2df start new exceptions 2014-01-18 21:36:01 +01:00
swcs 13e029a98a use FullTitle if no title given 2013-12-28 14:03:58 +01:00
swcs c6cf19ba4d bump version 2013-12-27 21:45:09 +01:00
swcs 50c15ad6ce remove exception debug code 2013-12-27 21:34:53 +01:00
swcs 670fecb1e0 respect given_url if no resolved_url is given 2013-12-27 21:34:22 +01:00
swcs 85c4ca2c65 update readme 2013-12-19 11:27:11 +01:00
swcs 0183a727ce update readme 2013-12-19 11:25:51 +01:00
swcs 25bb5028a5 Remove PocketSharp.Reader => moved to ReadSharp
See https://github.com/ceee/ReadSharp if you want to use ReadSharp
2013-12-19 11:24:22 +01:00
swcs 3201160d66 move image extractor into NReadability 2013-12-16 22:08:23 +01:00
swcs 996755ef50 extract images from article in Reader 2013-12-16 21:42:11 +01:00
swcs 6e6cef138a update tests; remove PocketArticle from PocketSharp 2013-12-16 21:11:04 +01:00
swcs bcb833ad0d remove PocketSharp dependency from Reader; move PocketArticle into Reader project; 2013-12-16 21:07:34 +01:00
swcs e33ec074fe PreRequest in IPocketClient 2013-12-15 12:49:45 +01:00
swcs a2e68af4dc update readme 2013-12-15 11:50:37 +01:00
swcs ab5361c370 bump version 2013-12-15 11:42:53 +01:00
swcs 4718faf76a HasImage and HasVideo has to be nullable for unresolved items 2013-12-15 11:10:56 +01:00
swcs f6e7594233 respect normal_uri, if submitted; PocketItem.ID as string 2013-12-15 11:00:00 +01:00
swcs c39f8ec7f0 make PocketBoolean internal 2013-12-07 20:42:12 +01:00
ScottIsAFool c1981bbb24 Fixed the HasImage and HasVideo properties 2013-12-07 17:30:53 +00:00
ScottIsAFool 425faf7a90 Added IsVideo, IsImage and ResolvedId props 2013-12-07 16:47:18 +00:00
swcs a1fae6b3ce fix PocketAction conversion 2013-12-04 22:14:29 +01:00
swcs 84981a5de3 add TweetID for Send actions 2013-12-04 20:31:23 +01:00
swcs 5480cebe49 publicly cache last response headers and data 2013-12-03 22:28:22 +01:00
swcs 3fca5a059b update tests 2013-12-02 22:51:24 +01:00
swcs 5854c0c04f rebuild issue #13 in WP8 sample (via Button click) 2013-11-23 22:45:03 +01:00
swcs e2ca21b3be add tests for the since parameter 2013-11-21 21:45:49 +01:00
swcs 178920008b fixes #12
ObjectToArrayConverter returns null when the TokenType is Null.
2013-11-20 20:45:55 +01:00
swcs 67c48839d9 fixes #12
Update ObjectToArrayConverter to return null when JObject cannot be
created
2013-11-19 19:30:59 +01:00
swcs e2bf62e506 Fix accessCode in examples 2013-11-18 23:12:30 +01:00
swcs 31c69fb12b merge 2013-11-18 22:52:39 +01:00
ScottIsAFool 42693a967e Added HttpClientHandler and timeout to ctors 2013-11-18 18:05:02 +00:00
swcs 29f57085aa add IE11 user agent for PocketReader; update to RC3 2013-11-16 15:34:36 +01:00
swcs 5ba027bafc test SendActions 2013-11-16 15:27:54 +01:00
swcs 33e6e9b02d add SendActions method 2013-11-16 15:09:21 +01:00
swcs 44376c0852 IPocketReader interface 2013-11-15 14:30:20 +01:00
swcs a643e5c556 update readme 2013-11-15 14:23:21 +01:00
swcs b2ce585966 bodyOnly and noHeadline options for PocketReader.Read 2013-11-15 14:20:56 +01:00
swcs 6f6d054044 update readme 2013-11-15 13:52:22 +01:00
swcs ff4fae1d35 add second NuGet package for PocketReader; allow user agent in PocketReader constructor 2013-11-15 13:43:27 +01:00
swcs f5c8d45013 move PocketReader into own project 2013-11-15 13:28:16 +01:00
swcs ad40a25b0b make user agent a public property in PocketReader 2013-11-14 20:02:56 +01:00
swcs eb3ac1f152 Update README.md 2013-11-14 19:53:56 +01:00
swcs 3bff4d823f update dependencies 2013-11-14 19:33:55 +01:00
swcs 0427399746 add stress tests 2013-11-13 20:23:02 +01:00
swcs ee989fc019 custom UriConverter to check for invalid URIs 2013-11-12 22:08:02 +01:00
swcs 2a9c30a69b add PreRequest action for all requests 2013-11-11 22:00:41 +01:00
swcs 95d7a5d993 make CancellationToken an optional parameter 2013-11-08 09:31:35 +01:00
swcs bf5d8a50ce cancellationToken for ALL methods - completed; remove obsolete methods in preparation for v3 2013-11-08 01:44:32 +01:00
swcs 10e9575303 cancellationToken for Modify methods 2013-11-08 01:33:32 +01:00
swcs feff91ffd8 cancellationToken for Get methods 2013-11-08 01:24:58 +01:00
swcs 50d896c670 cancellationToken for Add and Account methods 2013-11-08 01:12:34 +01:00
swcs f0ffeb5a68 Merge branch 'stress' 2013-11-08 00:56:02 +01:00
swcs 6b3819b87b require Uri to be absolute in Add method 2013-11-08 00:55:44 +01:00
swcs 8df2836563 add CancellationToken to PocketClient; methods later; 2013-11-06 20:47:53 +01:00
swcs d856e75e76 make test playlists working for XUnit update 2013-11-05 23:31:19 +01:00
swcs 82c9ecd6b5 remove Utilities.DictionaryToList - not needed 2013-11-05 23:17:45 +01:00
swcs 7147d8022e update docs 2013-11-05 23:13:14 +01:00
swcs b1888ac20e Merge branch 'master' of github.com:ceee/PocketSharp 2013-11-04 22:46:47 +01:00
swcs cb8d1d9d43 make Test playlists; refactored PocketItem inline lists (setters are working now); 2013-11-04 22:46:30 +01:00
swcs 2b932d4c07 Update README.md 2013-11-04 08:26:23 +01:00
swcs bc30ea613a Merge branch 'ScottIsAFool-master' 2013-11-03 20:24:45 +01:00
swcs b1b145204e add regions 2013-11-03 20:24:32 +01:00
swcs 01be59b347 add FillAccount method for stress tests 2013-11-03 20:18:57 +01:00
ScottIsAFool af3e2b400b Added IPocketClient interface
Any future public methods that get added in any partial files just need
adding to the interface file too.
2013-11-03 18:07:26 +00:00
swcs 396cf69a40 convert nulls for bool and int in JSOn reader; update stress tests 2013-11-03 18:27:35 +01:00
swcs 088f6a4e0e add stress test wrapper and URL csv's 2013-11-02 10:32:38 +01:00
swcs 25a25472b3 add test for too short passwords in registration 2013-11-02 10:18:33 +01:00
162 changed files with 131586 additions and 15284 deletions
+23
View File
@@ -0,0 +1,23 @@
# Auto detect text files and perform LF normalization
* text
# Don't check these into the repo as LF to work around TeamCity bug
*.xml -text
*.targets -text
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Denote all files that are truly binary and should not be modified.
*.dll binary
*.exe binary
*.png binary
*.ico binary
*.snk binary
*.pdb binary
*.svg binary
+3
View File
@@ -142,6 +142,9 @@ UpgradeLog*.htm
App_Data/*.mdf App_Data/*.mdf
App_Data/*.ldf App_Data/*.ldf
.vs
.nuget
# ========================= # =========================
# Windows detritus # Windows detritus
# ========================= # =========================
+80 -3
View File
@@ -1,3 +1,80 @@
<<<<<<< HEAD
=======
### 4.2.0 (2015-12-05)
- Update packages
- Remove decompression from HttpClient so it works with UWP
### 4.1.6 (2014-08-28)
- Fix DateTime conversion issue (from local to UTC)
>>>>>>> simple
### 4.1.5 (2014-07-27)
- Fix StackOverflow bug in PocketItem equality overload (fixes #28)
### 4.1.4 (2014-07-18)
- Implement WebAuthenticationBroker-view toggle
### 4.1.3 (2014-06-25)
- Only dispose response if available
### 4.1.2 (2014-06-18)
- Add force param to login+registration
### 4.1.1 (2014-06-17)
- Fix batch adding bug
### 4.1.0 (2014-06-16)
- Include access to the Article View API
### 4.0.0 (2014-04-03)
- Support for Universal apps (dropped SL and WP7 support)
### 3.2.0 (2014-03-13)
- add raw JSON to each PocketItem (PR #22)
### 3.1.1 (2014-02-23)
- fix SendActions when sending _add_ requests (fixes #20)
- try to normalize URIs retrieved in video array
### 3.1.0 (2014-02-07)
- Use FullTitle if no other title props are available
- Default mobile authentication screen with toggle for desktop (fixes #17)
- Use new registration endpoint
### 3.0.2 (2013-12-27)
- assign given_url to `Uri` when item couldn't be resolved by Pocket
### 3.0.1 (2013-12-15)
- added `PreRequest` to interface
### 3.0.0 (2013-12-15)
- `cancellationToken` support for all methods
- Toggle inclusion of title in PocketArticle.Content
- Make setters for inline objects in PocketItem (images, videos, ...)
- IPocketClient interface
- PreRequest callback allows injection of `Action<string>` before every request
- `lastHeaders` and `lastRequestData` in PocketClient for better debugging
- Submit multiple actions in one request with `SendActions`
- New `IsVideo`, `IsImage` and `ResolvedId` as new properties in PocketItem
- Split PocketReader into own NuGet package
- A lot of bugfixes
### 2.2.2 (2013-11-01) ### 2.2.2 (2013-11-01)
- Password validation in RegisterAccount - Password validation in RegisterAccount
@@ -9,13 +86,13 @@
### 2.2.0 (2013-10-26) ### 2.2.0 (2013-10-26)
- Made `GetAccessCode` obsolete - Made `GetAccessCode` obsolete
- Return username after authentication with `GetUser` (thanks to [ScottIsAFool](https://github.com/ScottIsAFool)) - Return username after authentication with `GetUser`
### 2.1.0 (2013-10-25) ### 2.1.0 (2013-10-25)
- Rename `Statistics()` to `GetUserStatistics()` - Rename `Statistics()` to `GetUserStatistics()`
- Made `CallbackUri` public (thanks to [ScottIsAFool](https://github.com/ScottIsAFool)) - Made `CallbackUri` public
- Added Fody/PropertyChanged (thanks to [ScottIsAFool](https://github.com/ScottIsAFool)) - Added Fody/PropertyChanged
- Method `GetUsageLimits()` to retrieve API usage limits - Method `GetUsageLimits()` to retrieve API usage limits
- Add PORTABLE constant to SgmlReader - Add PORTABLE constant to SgmlReader
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright (c) 2013 cee, Tobias Klika Copyright (c) 2015 cee, Tobias Klika
Permission is hereby granted, free of charge, to any person Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation obtaining a copy of this software and associated documentation
@@ -1,8 +0,0 @@
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="PocketSharp.Silverlight.App"
>
<Application.Resources>
</Application.Resources>
</Application>
@@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace PocketSharp.Silverlight
{
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new MainPage();
}
private void Application_Exit(object sender, EventArgs e)
{
}
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
// If the app is running outside of the debugger then report the exception using
// the browser's exception mechanism. On IE this will display it a yellow alert
// icon in the status bar and Firefox will display a script error.
if (!System.Diagnostics.Debugger.IsAttached)
{
// NOTE: This will allow the application to continue running after an exception has been thrown
// but not handled.
// For production applications this error handling should be replaced with something that will
// report the error to the website and stop the application.
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
try
{
string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
}
catch (Exception)
{
}
}
}
}
@@ -1,16 +0,0 @@
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="PocketSharp.Silverlight.MainPage"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<Button Content="Load Items" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="380" Height="34" Click="Button_Click"/>
<sdk:DataGrid x:Name="Content" HorizontalAlignment="Left" Height="241" Margin="10,49,0,0" VerticalAlignment="Top" Width="380" FrozenColumnCount="2"/>
</Grid>
</UserControl>
@@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace PocketSharp.Silverlight
{
public partial class MainPage : UserControl
{
ObservableCollection<Site> _Sites = new ObservableCollection<Site>();
public ObservableCollection<Site> Sites { get { return _Sites; } }
public class Site
{
public string Url { get; set; }
public string Content { get; set; }
}
public MainPage()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
// !! please don't misuse this account !!
PocketClient client = new PocketClient(
consumerKey: "15396-f6f92101d72c8e270a6c9bb3",
callbackUri: "http://frontendplay.com",
accessCode: "2c62cd50-b78a-5558-918b-65adae"
);
List<PocketSharp.Models.PocketItem> items = null;
try
{
items = await client.Get();
items.ForEach(item =>
{
Sites.Add(new Site()
{
Content = item.Title,
Url = item.Uri.ToString()
});
});
Content.ItemsSource = Sites;
}
catch (PocketException ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
@@ -1,158 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}</ProjectGuid>
<ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PocketSharp.Silverlight</RootNamespace>
<AssemblyName>PocketSharp.Silverlight</AssemblyName>
<TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
<SilverlightApplication>true</SilverlightApplication>
<SupportedCultures>
</SupportedCultures>
<XapOutputs>true</XapOutputs>
<GenerateSilverlightManifest>true</GenerateSilverlightManifest>
<XapFilename>PocketSharp.Silverlight.xap</XapFilename>
<SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
<SilverlightAppEntry>PocketSharp.Silverlight.App</SilverlightAppEntry>
<TestPageFileName>PocketSharp.SilverlightTestPage.html</TestPageFileName>
<CreateTestPage>true</CreateTestPage>
<ValidateXaml>true</ValidateXaml>
<EnableOutOfBrowser>false</EnableOutOfBrowser>
<OutOfBrowserSettingsFile>Properties\OutOfBrowserSettings.xml</OutOfBrowserSettingsFile>
<UsePlatformExtensions>false</UsePlatformExtensions>
<ThrowErrorsInValidation>true</ThrowErrorsInValidation>
<LinkedServerProject>
</LinkedServerProject>
<ExpressionBlendVersion>12.0.40612.10</ExpressionBlendVersion>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<!-- This property group is only here to support building this project using the
MSBuild 3.5 toolset. In order to work correctly with this older toolset, it needs
to set the TargetFrameworkVersion to v3.5 -->
<PropertyGroup Condition="'$(MSBuildToolsVersion)' == '3.5'">
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Bin\Debug</OutputPath>
<DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>Bin\Release</OutputPath>
<DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Threading.Tasks">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\sl4\Microsoft.Threading.Tasks.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\sl4\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions.Silverlight">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\sl4\Microsoft.Threading.Tasks.Extensions.Silverlight.dll</HintPath>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.IO, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Microsoft.Bcl.1.1.3\lib\sl5\System.IO.dll</HintPath>
</Reference>
<Reference Include="System.Runtime, Version=2.6.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Microsoft.Bcl.1.1.3\lib\sl5\System.Runtime.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks, Version=2.6.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Microsoft.Bcl.1.1.3\lib\sl5\System.Threading.Tasks.dll</HintPath>
</Reference>
<Reference Include="System.Windows" />
<Reference Include="system" />
<Reference Include="System.Core">
<HintPath>$(TargetFrameworkDirectory)System.Core.dll</HintPath>
</Reference>
<Reference Include="System.Net" />
<Reference Include="System.Windows.Controls.Data" />
<Reference Include="System.Windows.Controls.Data.Input" />
<Reference Include="System.Windows.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Windows.Browser" />
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\AppManifest.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\PocketSharp\PocketSharp.csproj">
<Project>{817200c3-a327-4e35-9b5f-63a51c088577}</Project>
<Name>PocketSharp</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
<SilverlightProjectProperties />
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
<Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
<Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target>
</Project>
@@ -1,6 +0,0 @@
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Deployment.Parts>
</Deployment.Parts>
</Deployment>
@@ -1,35 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PocketSharp.Silverlight")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PocketSharp.Silverlight")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("656345d2-af4c-4f88-9c9f-ebf54d7691db")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Bcl" version="1.1.3" targetFramework="sl50" />
<package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="sl50" />
<package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="sl50" />
</packages>
@@ -0,0 +1,8 @@
<Application
x:Class="PocketSharp.UWP.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:PocketSharp.UWP"
RequestedTheme="Light">
</Application>
@@ -0,0 +1,87 @@
using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace PocketSharp.UWP
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App : Application
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
// Ensure the current window is active
Window.Current.Activate();
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
deferral.Complete();
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8" ?>
<Weavers> <Weavers>
<PropertyChanged /> <PropertyChanged />
</Weavers> </Weavers>
@@ -0,0 +1,38 @@
<Page
x:Class="PocketSharp.UWP.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:PocketSharp.UWP"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<Button Click="Button_Click">Load Data</Button>
</StackPanel>
<!--ContentPanel contains LongListSelector and LongListSelector ItemTemplate. Place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListView ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17">
<TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
<TextBlock Text="{Binding Uri}" TextWrapping="Wrap" Margin="12,-6,12,0" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Grid>
</Grid>
</Page>
@@ -0,0 +1,58 @@
using PocketSharp.Models;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace PocketSharp.UWP
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public ObservableCollection<PocketItem> Items { get; set; }
public MainPage()
{
InitializeComponent();
Items = new ObservableCollection<PocketItem>();
}
public async Task LoadData()
{
// !! please don't misuse this account !!
PocketClient client = new PocketClient(
consumerKey: "15396-f6f92101d72c8e270a6c9bb3",
callbackUri: "http://frontendplay.com",
accessCode: "80acf6c5-c198-03c0-b94c-e74402"
);
List<PocketSharp.Models.PocketItem> items = null;
try
{
items = (await client.Get()).ToList();
foreach (var item in items)
{
Items.Add(item);
}
}
catch (PocketException ex)
{
Debug.WriteLine(ex.Message);
}
}
private async void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
await LoadData();
}
}
}
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
IgnorableNamespaces="uap mp">
<Identity
Name="17071047-817c-42b4-837d-8530fd36e521"
Publisher="CN=tobi"
Version="1.0.0.0" />
<mp:PhoneIdentity PhoneProductId="17071047-817c-42b4-837d-8530fd36e521" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>PocketSharp.UWP</DisplayName>
<PublisherDisplayName>tobi</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="PocketSharp.UWP.App">
<uap:VisualElements
DisplayName="PocketSharp.UWP"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png"
Description="PocketSharp.UWP"
BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProjectGuid>{5CBB92EC-C1A2-4108-9A23-3B73DD138953}</ProjectGuid>
<OutputType>AppContainerExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PocketSharp.UWP</RootNamespace>
<AssemblyName>PocketSharp.UWP</AssemblyName>
<DefaultLanguage>en-US</DefaultLanguage>
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
<TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
<MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<PackageCertificateKeyFile>PocketSharp.UWP_TemporaryKey.pfx</PackageCertificateKeyFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\ARM\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
<OutputPath>bin\ARM\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>ARM</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<NoWarn>;2008</NoWarn>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<Optimize>true</Optimize>
<NoWarn>;2008</NoWarn>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit>
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<ItemGroup>
<!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->
<None Include="project.json" />
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<AppxManifest Include="Package.appxmanifest">
<SubType>Designer</SubType>
</AppxManifest>
<None Include="PocketSharp.UWP_TemporaryKey.pfx" />
</ItemGroup>
<ItemGroup>
<Content Include="FodyWeavers.xml">
<SubType>Designer</SubType>
</Content>
<Content Include="Properties\Default.rd.xml" />
<Content Include="Assets\LockScreenLogo.scale-200.png" />
<Content Include="Assets\SplashScreen.scale-200.png" />
<Content Include="Assets\Square150x150Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.scale-200.png" />
<Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
<Content Include="Assets\StoreLogo.png" />
<Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\PocketSharp\PocketSharp.csproj">
<Project>{0e22926c-7244-4a17-923c-84b46f5149c0}</Project>
<Name>PocketSharp</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">O:\PocketSharp\PocketSharp.Examples\PocketSharp.UWP\project.lock.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tobi\.nuget\packages\;C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">ProjectJson</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">4.5.0</NuGetToolVersion>
</PropertyGroup>
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)runtime.win10-x86.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" Condition="Exists('$(NuGetPackageRoot)runtime.win10-x86.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props')" />
<Import Project="$(NuGetPackageRoot)runtime.win10-x64.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" Condition="Exists('$(NuGetPackageRoot)runtime.win10-x64.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props')" />
<Import Project="$(NuGetPackageRoot)runtime.win10-arm.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" Condition="Exists('$(NuGetPackageRoot)runtime.win10-arm.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.uwpcoreruntimesdk\2.1.2\build\Microsoft.Net.UWPCoreRuntimeSdk.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.uwpcoreruntimesdk\2.1.2\build\Microsoft.Net.UWPCoreRuntimeSdk.props')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x86\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x86.props" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x86\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x86.props')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x64\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x64.props" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x64\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x64.props')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-arm\2.0.0\build\Microsoft.Net.Native.SharedLibrary-arm.props" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-arm\2.0.0\build\Microsoft.Net.Native.SharedLibrary-arm.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.native.compiler\2.0.3\build\Microsoft.Net.Native.Compiler.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.native.compiler\2.0.3\build\Microsoft.Net.Native.Compiler.props')" />
</ImportGroup>
</Project>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)runtime.win10-x86.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" Condition="Exists('$(NuGetPackageRoot)runtime.win10-x86.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets')" />
<Import Project="$(NuGetPackageRoot)runtime.win10-x64.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" Condition="Exists('$(NuGetPackageRoot)runtime.win10-x64.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets')" />
<Import Project="$(NuGetPackageRoot)runtime.win10-arm.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" Condition="Exists('$(NuGetPackageRoot)runtime.win10-arm.microsoft.net.uwpcoreruntimesdk\2.1.2\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\netstandard.library\2.0.1\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\netstandard.library\2.0.1\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="$(NuGetPackageRoot)fody\3.0.0\build\Fody.targets" Condition="Exists('$(NuGetPackageRoot)fody\3.0.0\build\Fody.targets')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x86\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x86.targets" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x86\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x86.targets')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x64\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x64.targets" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-x64\2.0.0\build\Microsoft.Net.Native.SharedLibrary-x64.targets')" />
<Import Project="C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-arm\2.0.0\build\Microsoft.Net.Native.SharedLibrary-arm.targets" Condition="Exists('C:\Program Files (x86)\Microsoft SDKs\NuGetPackagesFallback\microsoft.net.native.sharedlibrary-arm\2.0.0\build\Microsoft.Net.Native.SharedLibrary-arm.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.native.compiler\2.0.3\build\Microsoft.Net.Native.Compiler.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.net.native.compiler\2.0.3\build\Microsoft.Net.Native.Compiler.targets')" />
</ImportGroup>
</Project>
@@ -1,20 +1,18 @@
using System.Resources; using System.Reflection;
using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("SgmlReader")] [assembly: AssemblyTitle("PocketSharp.UWP")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SgmlReader")] [assembly: AssemblyProduct("PocketSharp.UWP")]
[assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("en")]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //
@@ -28,3 +26,4 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: ComVisible(false)]
@@ -0,0 +1,31 @@
<!--
This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most
developers. However, you can modify these parameters to modify the behavior of the .NET Native
optimizer.
Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919
To fully enable reflection for App1.MyClass and all of its public/private members
<Type Name="App1.MyClass" Dynamic="Required All"/>
To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32
<TypeInstantiation Name="App1.AppClass" Arguments="System.Int32" Activate="Required Public" />
Using the Namespace directive to apply reflection policy to all the types in a particular namespace
<Namespace Name="DataClasses.ViewModels" Seralize="All" />
-->
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!--
An Assembly element with Name="*Application*" applies to all assemblies in
the application package. The asterisks are not wildcards.
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>
@@ -0,0 +1,18 @@
{
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "6.0.8",
"Newtonsoft.Json": "11.0.2",
"PropertyChanged.Fody": "2.4.0"
},
"frameworks": {
"uap10.0.15063": {}
},
"runtimes": {
"win10-arm": {},
"win10-arm-aot": {},
"win10-x86": {},
"win10-x86-aot": {},
"win10-x64": {},
"win10-x64-aot": {}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,20 +0,0 @@
<Application
x:Class="PocketSharp.WP8.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone">
<!--Application Resources-->
<Application.Resources>
<local:LocalizedStrings xmlns:local="clr-namespace:PocketSharp.WP8" x:Key="LocalizedStrings"/>
</Application.Resources>
<Application.ApplicationLifetimeObjects>
<!--Required object that handles lifetime events for the application-->
<shell:PhoneApplicationService
Launching="Application_Launching" Closing="Application_Closing"
Activated="Application_Activated" Deactivated="Application_Deactivated"/>
</Application.ApplicationLifetimeObjects>
</Application>
@@ -1,247 +0,0 @@
using System;
using System.Diagnostics;
using System.Resources;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using PocketSharp.WP8.Resources;
using PocketSharp.WP8.ViewModels;
namespace PocketSharp.WP8
{
public partial class App : Application
{
private static MainViewModel viewModel = null;
/// <summary>
/// A static ViewModel used by the views to bind against.
/// </summary>
/// <returns>The MainViewModel object.</returns>
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
/// <summary>
/// Provides easy access to the root frame of the Phone Application.
/// </summary>
/// <returns>The root frame of the Phone Application.</returns>
public static PhoneApplicationFrame RootFrame { get; private set; }
/// <summary>
/// Constructor for the Application object.
/// </summary>
public App()
{
// Global handler for uncaught exceptions.
UnhandledException += Application_UnhandledException;
// Standard XAML initialization
InitializeComponent();
// Phone-specific initialization
InitializePhoneApplication();
// Language display initialization
InitializeLanguage();
// Show graphics profiling information while debugging.
if (Debugger.IsAttached)
{
// Display the current frame rate counters.
Application.Current.Host.Settings.EnableFrameRateCounter = true;
// Show the areas of the app that are being redrawn in each frame.
//Application.Current.Host.Settings.EnableRedrawRegions = true;
// Enable non-production analysis visualization mode,
// which shows areas of a page that are handed off GPU with a colored overlay.
//Application.Current.Host.Settings.EnableCacheVisualization = true;
// Prevent the screen from turning off while under the debugger by disabling
// the application's idle detection.
// Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
// and consume battery power when the user is not using the phone.
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
}
}
// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}
// Code to execute when the application is activated (brought to foreground)
// This code will not execute when the application is first launched
private void Application_Activated(object sender, ActivatedEventArgs e)
{
// Ensure that application state is restored appropriately
if (!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
}
// Code to execute when the application is deactivated (sent to background)
// This code will not execute when the application is closing
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
// Ensure that required application state is persisted here.
}
// Code to execute when the application is closing (eg, user hit Back)
// This code will not execute when the application is deactivated
private void Application_Closing(object sender, ClosingEventArgs e)
{
}
// Code to execute if a navigation fails
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
if (Debugger.IsAttached)
{
// A navigation has failed; break into the debugger
Debugger.Break();
}
}
// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (Debugger.IsAttached)
{
// An unhandled exception has occurred; break into the debugger
Debugger.Break();
}
}
#region Phone application initialization
// Avoid double-initialization
private bool phoneApplicationInitialized = false;
// Do not add any additional code to this method
private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return;
// Create the frame but don't set it as RootVisual yet; this allows the splash
// screen to remain active until the application is ready to render.
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
// Handle navigation failures
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
// Handle reset requests for clearing the backstack
RootFrame.Navigated += CheckForResetNavigation;
// Ensure we don't initialize again
phoneApplicationInitialized = true;
}
// Do not add any additional code to this method
private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
// Set the root visual to allow the application to render
if (RootVisual != RootFrame)
RootVisual = RootFrame;
// Remove this handler since it is no longer needed
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}
private void CheckForResetNavigation(object sender, NavigationEventArgs e)
{
// If the app has received a 'reset' navigation, then we need to check
// on the next navigation to see if the page stack should be reset
if (e.NavigationMode == NavigationMode.Reset)
RootFrame.Navigated += ClearBackStackAfterReset;
}
private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)
{
// Unregister the event so it doesn't get called again
RootFrame.Navigated -= ClearBackStackAfterReset;
// Only clear the stack for 'new' (forward) and 'refresh' navigations
if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh)
return;
// For UI consistency, clear the entire page stack
while (RootFrame.RemoveBackEntry() != null)
{
; // do nothing
}
}
#endregion
// Initialize the app's font and flow direction as defined in its localized resource strings.
//
// To ensure that the font of your application is aligned with its supported languages and that the
// FlowDirection for each of those languages follows its traditional direction, ResourceLanguage
// and ResourceFlowDirection should be initialized in each resx file to match these values with that
// file's culture. For example:
//
// AppResources.es-ES.resx
// ResourceLanguage's value should be "es-ES"
// ResourceFlowDirection's value should be "LeftToRight"
//
// AppResources.ar-SA.resx
// ResourceLanguage's value should be "ar-SA"
// ResourceFlowDirection's value should be "RightToLeft"
//
// For more info on localizing Windows Phone apps see http://go.microsoft.com/fwlink/?LinkId=262072.
//
private void InitializeLanguage()
{
try
{
// Set the font to match the display language defined by the
// ResourceLanguage resource string for each supported language.
//
// Fall back to the font of the neutral language if the Display
// language of the phone is not supported.
//
// If a compiler error is hit then ResourceLanguage is missing from
// the resource file.
RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage);
// Set the FlowDirection of all elements under the root frame based
// on the ResourceFlowDirection resource string for each
// supported language.
//
// If a compiler error is hit then ResourceFlowDirection is missing from
// the resource file.
FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection);
RootFrame.FlowDirection = flow;
}
catch
{
// If an exception is caught here it is most likely due to either
// ResourceLangauge not being correctly set to a supported language
// code or ResourceFlowDirection is set to a value other than LeftToRight
// or RightToLeft.
if (Debugger.IsAttached)
{
Debugger.Break();
}
throw;
}
}
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

@@ -1,44 +0,0 @@
<phone:PhoneApplicationPage
x:Class="PocketSharp.WP8.DetailsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--Data context is set to sample data above and first item in sample data collection below and LayoutRoot contains the root grid where all other page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent" d:DataContext="{Binding Items[0]}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="{Binding LineOne}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel contains details text. Place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Text="{Binding LineThree}" TextWrapping="Wrap" Style="{StaticResource PhoneTextNormalStyle}"/>
</Grid>
<!--Uncomment to see an alignment grid to help ensure your controls are
aligned on common boundaries. The image has a top margin of -32px to
account for the System Tray. Set this to 0 (or remove the margin altogether)
if the System Tray is hidden.
Before shipping remove this XAML and the image itself.-->
<!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->
</Grid>
</phone:PhoneApplicationPage>
@@ -1,55 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using PocketSharp.WP8.Resources;
namespace PocketSharp.WP8
{
public partial class DetailsPage : PhoneApplicationPage
{
// Constructor
public DetailsPage()
{
InitializeComponent();
// Sample code to localize the ApplicationBar
//BuildLocalizedApplicationBar();
}
// When page is navigated to set data context to selected item in list
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (DataContext == null)
{
string selectedIndex = "";
if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex))
{
int index = int.Parse(selectedIndex);
DataContext = App.ViewModel.Items[index];
}
}
}
// Sample code for building a localized ApplicationBar
//private void BuildLocalizedApplicationBar()
//{
// // Set the page's ApplicationBar to a new instance of ApplicationBar.
// ApplicationBar = new ApplicationBar();
// // Create a new button and set the text value to the localized string from AppResources.
// ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
// appBarButton.Text = AppResources.AppBarButtonText;
// ApplicationBar.Buttons.Add(appBarButton);
// // Create a new menu item with the localized string from AppResources.
// ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
// ApplicationBar.MenuItems.Add(appBarMenuItem);
//}
}
}
@@ -1,14 +0,0 @@
using PocketSharp.WP8.Resources;
namespace PocketSharp.WP8
{
/// <summary>
/// Provides access to string resources.
/// </summary>
public class LocalizedStrings
{
private static AppResources _localizedResources = new AppResources();
public AppResources LocalizedResources { get { return _localizedResources; } }
}
}
@@ -1,72 +0,0 @@
<phone:PhoneApplicationPage
x:Class="PocketSharp.WP8.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--Data context is set to sample data above and LayoutRoot contains the root grid where all other page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- LOCALIZATION NOTE:
To localize the displayed strings copy their values to appropriately named
keys in the app's neutral language resource file (AppResources.resx) then
replace the hard-coded text value between the attributes' quotation marks
with the binding clause whose path points to that string name.
For example:
Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"
This binding points to the template's string resource named "ApplicationTitle".
Adding supported languages in the Project Properties tab will create a
new resx file per language that can carry the translated values of your
UI strings. The binding in these examples will cause the value of the
attributes to be drawn from the .resx file that matches the
CurrentUICulture of the app at run time.
-->
<!--TitlePanel contains the name of the application and page title-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel contains LongListSelector and LongListSelector ItemTemplate. Place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<phone:LongListSelector x:Name="MainLongListSelector" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainLongListSelector_SelectionChanged">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17">
<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
</StackPanel>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
</Grid>
<!--Uncomment to see an alignment grid to help ensure your controls are
aligned on common boundaries. The image has a top margin of -32px to
account for the System Tray. Set this to 0 (or remove the margin altogether)
if the System Tray is hidden.
Before shipping remove this XAML and the image itself.-->
<!--<Image Source="/Assets/AlignmentGrid.png" VerticalAlignment="Top" Height="800" Width="480" Margin="0,-32,0,0" Grid.Row="0" Grid.RowSpan="2" IsHitTestVisible="False" />-->
</Grid>
</phone:PhoneApplicationPage>
@@ -1,69 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using PocketSharp.WP8.Resources;
using PocketSharp.WP8.ViewModels;
using System.Threading.Tasks;
namespace PocketSharp.WP8
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
// Set the data context of the LongListSelector control to the sample data
DataContext = App.ViewModel;
// Sample code to localize the ApplicationBar
//BuildLocalizedApplicationBar();
}
// Load data for the ViewModel Items
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
if (!App.ViewModel.IsDataLoaded)
{
await App.ViewModel.LoadData();
}
}
// Handle selection changed on LongListSelector
private void MainLongListSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// If selected item is null (no selection) do nothing
if (MainLongListSelector.SelectedItem == null)
return;
// Navigate to the new page
NavigationService.Navigate(new Uri("/DetailsPage.xaml?selectedItem=" + (MainLongListSelector.SelectedItem as ItemViewModel).ID, UriKind.Relative));
// Reset selected item to null (no selection)
MainLongListSelector.SelectedItem = null;
}
// Sample code for building a localized ApplicationBar
//private void BuildLocalizedApplicationBar()
//{
// // Set the page's ApplicationBar to a new instance of ApplicationBar.
// ApplicationBar = new ApplicationBar();
// // Create a new button and set the text value to the localized string from AppResources.
// ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
// appBarButton.Text = AppResources.AppBarButtonText;
// ApplicationBar.Buttons.Add(appBarButton);
// // Create a new menu item with the localized string from AppResources.
// ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
// ApplicationBar.MenuItems.Add(appBarMenuItem);
//}
}
}
@@ -1,199 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.20506</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{47721A56-2128-4C5A-8B92-995FFC353304}</ProjectGuid>
<ProjectTypeGuids>{C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PocketSharp.WP8</RootNamespace>
<AssemblyName>PocketSharp.WP8</AssemblyName>
<TargetFrameworkIdentifier>WindowsPhone</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
<SilverlightApplication>true</SilverlightApplication>
<SupportedCultures>
</SupportedCultures>
<XapOutputs>true</XapOutputs>
<GenerateSilverlightManifest>true</GenerateSilverlightManifest>
<XapFilename>PocketSharp.WP8_$(Configuration)_$(Platform).xap</XapFilename>
<SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
<SilverlightAppEntry>PocketSharp.WP8.App</SilverlightAppEntry>
<ValidateXaml>true</ValidateXaml>
<MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
<ThrowErrorsInValidation>true</ThrowErrorsInValidation>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Bin\Debug</OutputPath>
<DefineConstants>DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>Bin\Release</OutputPath>
<DefineConstants>TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Bin\x86\Debug</OutputPath>
<DefineConstants>DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>Bin\x86\Release</OutputPath>
<DefineConstants>TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|ARM' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Bin\ARM\Debug</OutputPath>
<DefineConstants>DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|ARM' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>Bin\ARM\Release</OutputPath>
<DefineConstants>TRACE;SILVERLIGHT;WINDOWS_PHONE</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="LocalizedStrings.cs" />
<Compile Include="DetailsPage.xaml.cs">
<DependentUpon>DetailsPage.xaml</DependentUpon>
</Compile>
<Compile Include="MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\AppResources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>AppResources.resx</DependentUpon>
</Compile>
<Compile Include="ViewModels\ItemViewModel.cs" />
<Compile Include="ViewModels\MainViewModel.cs" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</ApplicationDefinition>
<Page Include="DetailsPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="MainPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<DesignData Include="SampleData\MainViewModelSampleData.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</DesignData>
</ItemGroup>
<ItemGroup>
<None Include="Properties\AppManifest.xml" />
<None Include="Properties\WMAppManifest.xml">
<SubType>Designer</SubType>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="Assets\AlignmentGrid.png" />
<Content Include="Assets\ApplicationIcon.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Tiles\FlipCycleTileLarge.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Tiles\FlipCycleTileMedium.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Tiles\FlipCycleTileSmall.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Tiles\IconicTileMediumLarge.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Assets\Tiles\IconicTileSmall.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\AppResources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>AppResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\PocketSharp\PocketSharp.csproj">
<Project>{817200C3-A327-4E35-9B5F-63A51C088577}</Project>
<Name>PocketSharp</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.Threading.Tasks">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\wp8\Microsoft.Threading.Tasks.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\wp8\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions.Phone">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\wp8\Microsoft.Threading.Tasks.Extensions.Phone.dll</HintPath>
</Reference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\$(TargetFrameworkIdentifier)\$(TargetFrameworkVersion)\Microsoft.$(TargetFrameworkIdentifier).$(TargetFrameworkVersion).Overrides.targets" />
<Import Project="$(MSBuildExtensionsPath)\Microsoft\$(TargetFrameworkIdentifier)\$(TargetFrameworkVersion)\Microsoft.$(TargetFrameworkIdentifier).CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<ProjectExtensions />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
</Project>
@@ -1,6 +0,0 @@
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Deployment.Parts>
</Deployment.Parts>
</Deployment>
@@ -1,37 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Resources;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PocketSharp.WP8")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PocketSharp.WP8")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d4c30306-fbff-4433-8299-ecb70af9cfb6")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: NeutralResourcesLanguageAttribute("en-US")]
@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2012/deployment" AppPlatformVersion="8.0">
<DefaultLanguage xmlns="" code="en-US"/>
<App xmlns="" ProductID="{47721a56-2128-4c5a-8b92-995ffc353304}" Title="PocketSharp.WP8" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="PocketSharp.WP8 author" Description="Sample description" Publisher="PocketSharp.WP8" PublisherID="{d8449fc0-02fe-4be1-b0a5-3fd20d58264c}">
<IconPath IsRelative="true" IsResource="false">Assets\ApplicationIcon.png</IconPath>
<Capabilities>
<Capability Name="ID_CAP_NETWORKING"/>
<Capability Name="ID_CAP_MEDIALIB_AUDIO"/>
<Capability Name="ID_CAP_MEDIALIB_PLAYBACK"/>
<Capability Name="ID_CAP_SENSORS"/>
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/>
</Capabilities>
<Tasks>
<DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/>
</Tasks>
<Tokens>
<PrimaryToken TokenID="PocketSharp.WP8Token" TaskName="_default">
<TemplateFlip>
<SmallImageURI IsRelative="true" IsResource="false">Assets\Tiles\FlipCycleTileSmall.png</SmallImageURI>
<Count>0</Count>
<BackgroundImageURI IsRelative="true" IsResource="false">Assets\Tiles\FlipCycleTileMedium.png</BackgroundImageURI>
<Title>PocketSharp.WP8</Title>
<BackContent></BackContent>
<BackBackgroundImageURI></BackBackgroundImageURI>
<BackTitle></BackTitle>
<DeviceLockImageURI></DeviceLockImageURI>
<HasLarge></HasLarge>
</TemplateFlip>
</PrimaryToken>
</Tokens>
<ScreenResolutions>
<ScreenResolution Name="ID_RESOLUTION_WVGA"/>
<ScreenResolution Name="ID_RESOLUTION_WXGA"/>
<ScreenResolution Name="ID_RESOLUTION_HD720P"/>
</ScreenResolutions>
</App>
</Deployment>
@@ -1,138 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.17626
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PocketSharp.WP8.Resources
{
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class AppResources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal AppResources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager
{
get
{
if (object.ReferenceEquals(resourceMan, null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PocketSharp.WP8.Resources.AppResources", typeof(AppResources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to LeftToRight.
/// </summary>
public static string ResourceFlowDirection
{
get
{
return ResourceManager.GetString("ResourceFlowDirection", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to us-EN.
/// </summary>
public static string ResourceLanguage
{
get
{
return ResourceManager.GetString("ResourceLanguage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to MY APPLICATION.
/// </summary>
public static string ApplicationTitle
{
get
{
return ResourceManager.GetString("ApplicationTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Sample Runtime Property Value.
/// </summary>
public static string SampleProperty
{
get
{
return ResourceManager.GetString("SampleProperty", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to button text.
/// </summary>
public static string AppBarButtonText
{
get
{
return ResourceManager.GetString("AppBarButtonText", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to menu item.
/// </summary>
public static string AppBarMenuItemText
{
get
{
return ResourceManager.GetString("AppBarMenuItemText", resourceCulture);
}
}
}
}
@@ -1,140 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
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">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</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 for serialized 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.Runtime.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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<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" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</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>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ResourceFlowDirection" xml:space="preserve">
<value>LeftToRight</value>
<comment>Controls the FlowDirection for all elements in the RootFrame. Set to the traditional direction of this resource file's language</comment>
</data>
<data name="ResourceLanguage" xml:space="preserve">
<value>en-US</value>
<comment>Controls the Language and ensures that the font for all elements in the RootFrame aligns with the app's language. Set to the language code of this resource file's language.</comment>
</data>
<data name="ApplicationTitle" xml:space="preserve">
<value>MY APPLICATION</value>
</data>
<data name="SampleProperty" xml:space="preserve">
<value>Sample Runtime Property Value</value>
</data>
<data name="AppBarButtonText" xml:space="preserve">
<value>add</value>
</data>
<data name="AppBarMenuItemText" xml:space="preserve">
<value>Menu Item</value>
</data>
</root>
@@ -1,16 +0,0 @@
<vm:MainViewModel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:PocketSharp.WP8.ViewModels"
SampleProperty="Sample Text Property Value">
<vm:MainViewModel.Items>
<vm:ItemViewModel ID="0" LineOne="design one" LineTwo="Maecenas praesent accumsan bibendum" LineThree="Maecenas praesent accumsan bibendum dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur"/>
<vm:ItemViewModel ID="1" LineOne="design two" LineTwo="Dictumst eleifend facilisi faucibus" LineThree="Pharetra placerat pulvinar sagittis senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent"/>
<vm:ItemViewModel ID="2" LineOne="design three" LineTwo="Habitant inceptos interdum lobortis" LineThree="Accumsan bibendum dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur pharetra placerat"/>
<vm:ItemViewModel ID="3" LineOne="design four" LineTwo="Nascetur pharetra placerat pulvinar" LineThree="Pulvinar sagittis senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent accumsan bibendum"/>
<vm:ItemViewModel ID="4" LineOne="design five" LineTwo="Sagittis senectus sociosqu suscipit" LineThree="Dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur pharetra placerat pulvinar sagittis"/>
<vm:ItemViewModel ID="5" LineOne="design six" LineTwo="Torquent ultrices vehicula volutpat" LineThree="Senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent accumsan bibendum dictumst eleifend"/>
</vm:MainViewModel.Items>
</vm:MainViewModel>
@@ -1,109 +0,0 @@
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace PocketSharp.WP8.ViewModels
{
public class ItemViewModel : INotifyPropertyChanged
{
private string _id;
/// <summary>
/// Sample ViewModel property; this property is used to identify the object.
/// </summary>
/// <returns></returns>
public string ID
{
get
{
return _id;
}
set
{
if (value != _id)
{
_id = value;
NotifyPropertyChanged("ID");
}
}
}
private string _lineOne;
/// <summary>
/// Sample ViewModel property; this property is used in the view to display its value using a Binding.
/// </summary>
/// <returns></returns>
public string LineOne
{
get
{
return _lineOne;
}
set
{
if (value != _lineOne)
{
_lineOne = value;
NotifyPropertyChanged("LineOne");
}
}
}
private string _lineTwo;
/// <summary>
/// Sample ViewModel property; this property is used in the view to display its value using a Binding.
/// </summary>
/// <returns></returns>
public string LineTwo
{
get
{
return _lineTwo;
}
set
{
if (value != _lineTwo)
{
_lineTwo = value;
NotifyPropertyChanged("LineTwo");
}
}
}
private string _lineThree;
/// <summary>
/// Sample ViewModel property; this property is used in the view to display its value using a Binding.
/// </summary>
/// <returns></returns>
public string LineThree
{
get
{
return _lineThree;
}
set
{
if (value != _lineThree)
{
_lineThree = value;
NotifyPropertyChanged("LineThree");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
@@ -1,108 +0,0 @@
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using PocketSharp.WP8.Resources;
using PocketSharp;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;
namespace PocketSharp.WP8.ViewModels
{
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel()
{
this.Items = new ObservableCollection<ItemViewModel>();
}
/// <summary>
/// A collection for ItemViewModel objects.
/// </summary>
public ObservableCollection<ItemViewModel> Items { get; private set; }
private string _sampleProperty = "Sample Runtime Property Value";
/// <summary>
/// Sample ViewModel property; this property is used in the view to display its value using a Binding
/// </summary>
/// <returns></returns>
public string SampleProperty
{
get
{
return _sampleProperty;
}
set
{
if (value != _sampleProperty)
{
_sampleProperty = value;
NotifyPropertyChanged("SampleProperty");
}
}
}
/// <summary>
/// Sample property that returns a localized string
/// </summary>
public string LocalizedSampleProperty
{
get
{
return AppResources.SampleProperty;
}
}
public bool IsDataLoaded
{
get;
private set;
}
/// <summary>
/// Creates and adds a few ItemViewModel objects into the Items collection.
/// </summary>
public async Task LoadData()
{
// !! please don't misuse this account !!
PocketClient client = new PocketClient(
consumerKey: "15396-f6f92101d72c8e270a6c9bb3",
callbackUri: "http://frontendplay.com",
accessCode: "2c62cd50-b78a-5558-918b-65adae"
);
List<PocketSharp.Models.PocketItem> items = null;
try
{
items = await client.Get().ConfigureAwait(false);
items.ForEach(item =>
{
this.Items.Add(new ItemViewModel()
{
ID = item.ID.ToString(),
LineOne = item.Title,
LineTwo = item.Uri.ToString()
});
});
}
catch (PocketException ex)
{
Debug.WriteLine(ex.Message);
}
this.IsDataLoaded = true;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
@@ -1,8 +0,0 @@
<Application x:Class="PocketSharp.Wpf.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
namespace PocketSharp.Wpf
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}
@@ -1,18 +0,0 @@
<Window x:Class="PocketSharp.Wpf.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="443" Width="591">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" RenderTransformOrigin="0.547,0.566"/>
<ListView ItemsSource="{Binding Sites}" HorizontalAlignment="Left" Height="349" Margin="10,51,0,0" VerticalAlignment="Top" Width="561">
<ListView.View>
<GridView>
<GridViewColumn Width="160" Header="URL" DisplayMemberBinding="{Binding Url}" />
<GridViewColumn Width="401" Header="Content" DisplayMemberBinding="{Binding Content}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
@@ -1,62 +0,0 @@
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Collections.Generic;
using System;
namespace PocketSharp.Wpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<Site> _Sites = new ObservableCollection<Site>();
public ObservableCollection<Site> Sites { get { return _Sites; } }
public class Site
{
public string Url { get; set; }
public string Content { get; set; }
}
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
// !! please don't misuse this account !!
PocketClient client = new PocketClient(
consumerKey: "15396-f6f92101d72c8e270a6c9bb3",
callbackUri: "http://frontendplay.com",
accessCode: "2c62cd50-b78a-5558-918b-65adae"
);
List<PocketSharp.Models.PocketItem> items = null;
try
{
items = await client.Get();
items.ForEach(item =>
{
Sites.Add(new Site()
{
Content = item.Title,
Url = item.Uri.ToString()
});
});
}
catch (PocketException ex)
{
Debug.Write(ex.Message);
}
}
}
}
@@ -1,144 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{775569C2-987F-4AC4-8BA5-A315A21ED1B7}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PocketSharp.Wpf</RootNamespace>
<AssemblyName>PocketSharp.Wpf</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<TargetFrameworkProfile />
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Threading.Tasks">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\net45\Microsoft.Threading.Tasks.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions">
<HintPath>..\..\packages\Microsoft.Bcl.Async.1.0.16\lib\net45\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Net" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Extensions, Version=2.2.15.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Microsoft.Net.Http.2.2.15\lib\net45\System.Net.Http.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Primitives, Version=4.2.15.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Microsoft.Net.Http.2.2.15\lib\net45\System.Net.Http.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Site.cs" />
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\PocketSharp\PocketSharp.csproj">
<Project>{817200c3-a327-4e35-9b5f-63a51c088577}</Project>
<Name>PocketSharp</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
<Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
<Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -1,55 +0,0 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PocketSharp.Wpf")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PocketSharp.Wpf")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -1,63 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18213
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PocketSharp.Wpf.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PocketSharp.Wpf.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -1,117 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
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">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</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 for serialized 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="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<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>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -1,26 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18213
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PocketSharp.Wpf.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
@@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PocketSharp.Wpf
{
public class Site
{
public string Url { get; set; }
public string Content { get; set; }
}
}
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.15.0" newVersion="4.2.15.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Bcl" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="net45" />
<package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="net45" />
<package id="Microsoft.Net.Http" version="2.2.15" targetFramework="net45" />
</packages>
+11 -38
View File
@@ -1,8 +1,7 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Xunit;
using PocketSharp.Models; using PocketSharp.Models;
using System;
using System.Threading.Tasks;
using Xunit;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -12,48 +11,22 @@ namespace PocketSharp.Tests
[Fact] [Fact]
public async Task IsUserRegistered() public async Task IsAuthenticationSuccessful()
{ {
string randomId = ((int)((DateTime)DateTime.Now - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); string requestCode = await client.GetRequestCode();
bool success = await client.RegisterAccount("pocket-" + randomId, String.Format("pocketsharp-{0}@outlook.com", randomId), "mypassword"); PocketUser user = await client.GetUser(requestCode);
Assert.True(success);
} }
[Fact] [Fact]
public async Task AreInvalidRegistrationsBlocked() public async Task IsRegistrationURLSuccessfullyCreated()
{ {
await ThrowsAsync<FormatException>(async () => string requestCode = await client.GetRequestCode();
{
await client.RegisterAccount("abcdefghijklmnopqrstuvwxyz", "pocketsharp@outlook.com", "mypassword");
});
await ThrowsAsync<FormatException>(async () => Uri uri = client.GenerateRegistrationUri(requestCode);
{
await client.RegisterAccount("oiu_my:o;", "pocketsharp@outlook.com", "mypassword");
});
await ThrowsAsync<FormatException>(async () => Assert.Contains(requestCode, uri.OriginalString);
{ Assert.Contains("force=signup", uri.OriginalString);
await client.RegisterAccount("myusername", "pocketsharpoutlook.com", "mypassword");
});
await ThrowsAsync<FormatException>(async () =>
{
await client.RegisterAccount("myusername", "pocketsharp@outlook", "mypassword");
});
await ThrowsAsync<FormatException>(async () =>
{
await client.RegisterAccount("myusername", "pocketsharp@outlook,com", "mypassword");
});
await ThrowsAsync<ArgumentNullException>(async () =>
{
await client.RegisterAccount("myusername", null, "mypassword");
});
} }
} }
} }
+77 -7
View File
@@ -1,8 +1,9 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Xunit;
using PocketSharp.Models; using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using System.Linq;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -24,6 +25,19 @@ namespace PocketSharp.Tests
} }
[Fact]
public async Task ItemWithInstableImagesIsAdded()
{
var uri = new Uri("http://www.valoronline.com.br");
PocketItem item = await client.Add(uri);
Assert.NotNull(item);
itemsToDelete.Add(item.ID);
}
[Fact] [Fact]
public async Task AddComplexItem() public async Task AddComplexItem()
{ {
@@ -34,12 +48,12 @@ namespace PocketSharp.Tests
tweetID: "380051788172632065" tweetID: "380051788172632065"
); );
List<PocketItem> items = await client.Get(); List<PocketItem> items = (await client.Get()).ToList();
PocketItem itemDesired = null; PocketItem itemDesired = null;
items.ForEach(itm => items.ForEach(itm =>
{ {
if(itm.ID == item.ID) if (itm.ID == item.ID)
{ {
itemDesired = itm; itemDesired = itm;
} }
@@ -47,9 +61,65 @@ namespace PocketSharp.Tests
Assert.NotNull(itemDesired); Assert.NotNull(itemDesired);
Assert.Equal(itemDesired.ID, item.ID); Assert.Equal(itemDesired.ID, item.ID);
Assert.Equal(itemDesired.Tags.Count, 3); Assert.Equal(3, itemDesired.Tags.Count());
itemsToDelete.Add(item.ID); itemsToDelete.Add(item.ID);
} }
[Fact]
public async Task ItemViaActionsIsAdded()
{
List<PocketAction> actions = new List<PocketAction>();
actions.Add(new PocketAction()
{
Uri = new Uri("http://frontendplay.com/story/4015/string-indexer-for-text-resources-in-nancy"),
Action = "add",
Time = DateTime.Now
});
bool success = await client.SendActions(actions);
Assert.True(success);
IEnumerable<PocketItem> items = await client.Search("in nancy");
Assert.NotNull(items);
Assert.True(items.Count() > 0);
itemsToDelete.Add(items.First().ID);
}
[Fact]
public async Task ItemsViaActionsIsAdded()
{
List<PocketAction> actions = new List<PocketAction>();
actions.Add(new PocketAction()
{
Uri = new Uri("http://frontendplay.com/story/4015/string-indexer-for-text-resources-in-nancy"),
Action = "add",
Time = DateTime.Now
});
actions.Add(new PocketAction()
{
Uri = new Uri("http://frontendplay.com/story/4013/build-a-custom-razor-viewbase-in-nancy"),
Action = "add",
Time = DateTime.Now
});
bool success = await client.SendActions(actions);
Assert.True(success);
IEnumerable<PocketItem> items = await client.Search("in nancy");
Assert.NotNull(items);
Assert.True(items.Count() == 2);
itemsToDelete.AddRange(items.Select(item => item.ID));
}
} }
} }
+25
View File
@@ -0,0 +1,25 @@
using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using System.Linq;
namespace PocketSharp.Tests
{
public class ExploreTests : TestsBase
{
public ExploreTests() : base()
{
}
//[Fact]
//public async Task CheckPreRequestAction()
//{
// var results = await client.Explore(".net");
// Assert.NotEmpty(results);
//}
}
}
+184 -31
View File
@@ -1,8 +1,11 @@
using System; using Newtonsoft.Json.Linq;
using System.Threading.Tasks; using Newtonsoft.Json.Schema;
using System.Collections.Generic;
using Xunit;
using PocketSharp.Models; using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using System.Linq;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -14,8 +17,7 @@ namespace PocketSharp.Tests
[Fact] [Fact]
public async Task AreItemsRetrieved() public async Task AreItemsRetrieved()
{ {
List<PocketItem> items = await client.Get(); List<PocketItem> items = (await client.Get()).ToList();
Assert.True(items.Count > 0); Assert.True(items.Count > 0);
} }
@@ -23,7 +25,7 @@ namespace PocketSharp.Tests
[Fact] [Fact]
public async Task IsItemRetrievedById() public async Task IsItemRetrievedById()
{ {
List<PocketItem> items = await client.Get(); List<PocketItem> items = (await client.Get()).ToList();
PocketItem item = items[0]; PocketItem item = items[0];
PocketItem itemDuplicate = await client.Get(item.ID); PocketItem itemDuplicate = await client.Get(item.ID);
@@ -32,19 +34,47 @@ namespace PocketSharp.Tests
} }
[Fact]
public async Task AreSuggestionsRetrieved()
{
var articles = await client.GetTrendingArticles();
string itemId = articles.First().ID;
List<PocketItem> suggestions = (await client.GetSuggestions(itemId)).ToList();
Assert.True(suggestions.Count > 0);
}
// [Fact]
// public async Task IsItemJsonPopulated()
// {
// List<PocketItem> items = (await client.Get()).ToList();
// string schemaJson = @"{
// 'description': 'PocketItem',
// 'type': 'object'
// }";
// JsonSchema schema = JsonSchema.Parse(schemaJson);
// foreach (var pocketItem in items)
// {
// Assert.True(!string.IsNullOrWhiteSpace(pocketItem.Json));
// var jObject = JObject.Parse(pocketItem.Json);
// Assert.True(jObject.IsValid(schema));
// }
// }
[Fact] [Fact]
public async Task AreFilteredItemsRetrieved() public async Task AreFilteredItemsRetrieved()
{ {
List<PocketItem> items = await client.Get(RetrieveFilter.Favorite); IEnumerable<PocketItem> items = await client.Get(RetrieveFilter.Favorite);
Assert.True(items.Count > 0); Assert.True(items.Count() > 0);
} }
[Fact] [Fact]
public async Task RetrieveWithMultipleFilters() public async Task RetrieveWithMultipleFilters()
{ {
List<PocketItem> items = await client.Get( IEnumerable<PocketItem> items = await client.Get(
state: State.unread, state: State.unread,
tag: "pocket", tag: "pocket",
sort: Sort.title, sort: Sort.title,
@@ -52,78 +82,78 @@ namespace PocketSharp.Tests
count: 2 count: 2
); );
Assert.InRange<int>(items.Count, 0, 2); Assert.InRange<int>(items.Count(), 0, 2);
} }
[Fact] [Fact]
public async Task ItemContainsUri() public async Task ItemContainsUri()
{ {
List<PocketItem> items = await client.Get(count: 1); IEnumerable<PocketItem> items = await client.Get(count: 1);
Assert.True(items.Count == 1); Assert.True(1 == items.Count());
Assert.True(items[0].Uri.ToString().StartsWith("http")); Assert.StartsWith("http", items.First().Uri.OriginalString);
} }
[Fact] [Fact]
public async Task InvalidRetrievalReturnsNoResults() public async Task InvalidRetrievalReturnsNoResults()
{ {
List<PocketItem> items = await client.Get( IEnumerable<PocketItem> items = await client.Get(
favorite: true, favorite: true,
search: "xoiu987a#;" search: "xoiu987a#;"
); );
Assert.False(items.Count > 0); Assert.False(items.Count() > 0);
PocketItem item = await client.Get(99999999); PocketItem item = await client.Get("99999999");
Assert.Null(item); Assert.Null(item);
items = await client.Get(RetrieveFilter.Video); items = await client.Get(RetrieveFilter.Video);
Assert.False(items.Count > 0); Assert.False(items.Count() > 0);
} }
[Fact] [Fact]
public async Task SearchReturnsResult() public async Task SearchReturnsResult()
{ {
List<PocketItem> items = await client.Search("pocket"); IEnumerable<PocketItem> items = await client.Search("pocket");
Assert.True(items.Count > 0); Assert.True(items.Count() > 0);
Assert.True(items[0].FullTitle.ToLower().Contains("pocket")); Assert.Contains("pocket", items.First().FullTitle.ToLower());
} }
[Fact] [Fact]
public async Task InvalidSearchReturnsNoResult() public async Task InvalidSearchReturnsNoResult()
{ {
List<PocketItem> items = await client.Search("adsüasd-opiu2;.398dfyx"); IEnumerable<PocketItem> items = await client.Search("adsüasd-opiu2;.398dfyx");
Assert.False(items.Count > 0); Assert.False(items.Count() > 0);
} }
[Fact] [Fact]
public async Task RetrieveTagsReturnsResult() public async Task RetrieveTagsReturnsResult()
{ {
List<PocketTag> items = await client.GetTags(); IEnumerable<PocketTag> items = await client.GetTags();
Assert.True(items.Count > 0); Assert.True(items.Count() > 0);
} }
[Fact] [Fact]
public async Task SearchByTagsReturnsResult() public async Task SearchByTagsReturnsResult()
{ {
List<PocketItem> items = await client.SearchByTag("pocket"); IEnumerable<PocketItem> items = await client.SearchByTag("pocket");
Assert.True(items.Count == 1); Assert.True(items.Count() == 1);
bool found = false; bool found = false;
items[0].Tags.ForEach(tag => items.First().Tags.ToList().ForEach(tag =>
{ {
if (tag.Name.Contains("pocket")) if (tag.Name.Contains("pocket"))
{ {
@@ -138,16 +168,16 @@ namespace PocketSharp.Tests
[Fact] [Fact]
public async Task InvalidSearchByTagsReturnsNoResult() public async Task InvalidSearchByTagsReturnsNoResult()
{ {
List<PocketItem> items = await client.SearchByTag("adsüasd-opiu2;.398dfyx"); IEnumerable<PocketItem> items = await client.SearchByTag("adsüasd-opiu2;.398dfyx");
Assert.False(items.Count > 0); Assert.False(items.Count() > 0);
} }
[Fact] [Fact]
public async Task AreStatisticsRetrieved() public async Task AreStatisticsRetrieved()
{ {
PocketStatistics statistics = await client.Statistics(); PocketStatistics statistics = await client.GetUserStatistics();
Assert.True(statistics.CountAll > 0); Assert.True(statistics.CountAll > 0);
} }
@@ -160,5 +190,128 @@ namespace PocketSharp.Tests
Assert.True(limits.RateLimitForConsumerKey > 9999); Assert.True(limits.RateLimitForConsumerKey > 9999);
} }
[Fact]
public async Task IsNewPocketItemListGeneratorWorking()
{
IEnumerable<PocketItem> items = await client.Get(count: 1, tag: "pocket");
PocketItem item = items.First();
Assert.True(item.Tags.ToList().Find(i => i.Name == "pocket") != null);
}
[Fact]
public async Task IsSinceParameterWorkingOnAddTags()
{
DateTime since = DateTime.Now;
IEnumerable<PocketItem> items = await client.Get(state: State.all);
PocketItem itemToModify = items.First();
Assert.True(items.Count() >= 3);
items = await client.Get(state: State.all, since: since);
Assert.True(items == null || items.Count() == 0);
await client.AddTags(itemToModify, new string[] { "pocketsharp" });
items = await client.Get(state: State.all, since: since);
Assert.True(items.Count() > 0);
await client.RemoveTags(itemToModify, new string[] { "pocketsharp" });
}
[Fact]
public async Task IsSinceParameterWorkingOnFavoriteAndArchiveModification()
{
DateTime since = DateTime.Now;//1409221736
IEnumerable<PocketItem> items = await client.Get(state: State.all);
PocketItem itemToModify = items.First();
Assert.True(items.Count() >= 3);
items = await client.Get(state: State.all, since: since);
Assert.True(items == null || items.Count() == 0);
await client.Favorite(itemToModify);
items = await client.Get(state: State.all, since: since);
Assert.True(items.Count() > 0);
await client.Unfavorite(itemToModify);
since = DateTime.Now;
await client.Archive(itemToModify);
items = await client.Get(state: State.all, since: since);
Assert.True(items.Count() > 0);
await client.Unarchive(itemToModify);
}
[Fact]
public async Task IsUTCSinceParameterWorking()
{
DateTime since = DateTime.UtcNow;
IEnumerable<PocketItem> items = await client.Get(state: State.all);
PocketItem itemToModify = items.First();
items = await client.Get(state: State.all, since: since);
Assert.True(items == null || items.Count() == 0);
await client.Favorite(itemToModify);
items = await client.Get(state: State.all, since: since);
Assert.True(items.Count() > 0);
await client.Unfavorite(itemToModify);
}
[Fact]
public async Task IsSinceParameterWorkingOnAddAndDelete()
{
DateTime since = DateTime.UtcNow;
PocketItem item = await client.Add(new Uri("http://frontendplay.com"));
IEnumerable<PocketItem> items = await client.Get(state: State.all, since: since);
since = DateTime.UtcNow;
await client.Delete(item);
items = await client.Get(state: State.all, since: since);
Assert.True(items.Count() == 1 && items.First().IsDeleted);
}
[Fact]
public async Task AreUncachedItemsProperlyResolved()
{
PocketItem item = await client.Add(new Uri("http://de.ign.com/m/feature/21608/die-20-besten-kurzfilme-des-jahres-2013?bust=1"));
IEnumerable<PocketItem> items = await client.Get(state: State.all);
Assert.NotNull(item.Uri);
Assert.NotNull(items.First().Uri);
Assert.Equal(item.Uri, items.First().Uri);
itemsToDelete.Add(item.ID);
}
} }
} }
+56
View File
@@ -0,0 +1,56 @@
using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using System.Linq;
namespace PocketSharp.Tests
{
public class MiscTests : TestsBase
{
private int Incrementor = 0;
public MiscTests() : base()
{
client.PreRequest = method => Incrementor++;
}
[Fact]
public async Task CheckPreRequestAction()
{
IEnumerable<PocketItem> items = await client.Get(count: 1);
PocketItem item = items.First();
await client.Favorite(item);
await client.Unfavorite(item);
Assert.True(Incrementor >= 3);
}
[Fact]
public void ItemEqualityChecks()
{
PocketItem item1 = new PocketItem() { ID = "12872" };
PocketItem item2 = new PocketItem() { ID = "12872" };
PocketItem item3 = new PocketItem() { ID = "12800" };
PocketArticle article = new PocketArticle();
Assert.True(item1.Equals(item2));
Assert.False(item1.Equals(item3));
Assert.False(item1.Equals(null));
Assert.True(item1 == item2);
Assert.False(item1 == item3);
Assert.False(item1 == null);
Assert.False(item1 != item2);
Assert.True(item1 != item3);
Assert.True(item1 != null);
Assert.False(item1.Equals(article));
Assert.True(new List<PocketItem>() { item1 }.IndexOf(item2) > -1);
}
}
}
+9 -9
View File
@@ -1,9 +1,9 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Xunit;
using PocketSharp.Models; using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Xunit;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -21,7 +21,7 @@ namespace PocketSharp.Tests
item = await GetItemById(item.ID); item = await GetItemById(item.ID);
Assert.True(item.Tags.Count >= 2); Assert.True(item.Tags.Count() >= 2);
Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "test_tag")); Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "test_tag"));
Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "test_tag2")); Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "test_tag2"));
@@ -44,7 +44,7 @@ namespace PocketSharp.Tests
item = await GetItemById(item.ID); item = await GetItemById(item.ID);
Assert.True(item.Tags.Count >= 2); Assert.True(item.Tags.Count() >= 2);
Assert.True(await client.RemoveTags(item)); Assert.True(await client.RemoveTags(item));
@@ -63,7 +63,7 @@ namespace PocketSharp.Tests
item = await GetItemById(item.ID); item = await GetItemById(item.ID);
Assert.Equal(item.Tags.Count, 2); Assert.Equal(2, item.Tags.Count());
Assert.NotNull(item.Tags.SingleOrDefault<PocketTag>(tag => tag.Name == "test_tag")); Assert.NotNull(item.Tags.SingleOrDefault<PocketTag>(tag => tag.Name == "test_tag"));
Assert.NotNull(item.Tags.SingleOrDefault<PocketTag>(tag => tag.Name == "test_tag2")); Assert.NotNull(item.Tags.SingleOrDefault<PocketTag>(tag => tag.Name == "test_tag2"));
@@ -83,9 +83,9 @@ namespace PocketSharp.Tests
} }
private async Task<PocketItem> GetItemById(int id, bool archive = false) private async Task<PocketItem> GetItemById(string id, bool archive = false)
{ {
List<PocketItem> items = await client.Get(state: archive ? State.archive : State.unread); List<PocketItem> items = (await client.Get(state: archive ? State.archive : State.unread)).ToList();
PocketItem itemDesired = null; PocketItem itemDesired = null;
items.ForEach(itm => items.ForEach(itm =>
+65 -5
View File
@@ -1,8 +1,9 @@
using System; using PocketSharp.Models;
using System.Threading.Tasks; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit; using Xunit;
using PocketSharp.Models;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -62,6 +63,65 @@ namespace PocketSharp.Tests
} }
[Fact]
public async Task AreMultipleActionsSent()
{
PocketItem item = await Setup();
bool success = await client.SendActions(new List<PocketAction>()
{
new PocketAction() { Action = "favorite", ID = item.ID },
new PocketAction() { Action = "tags_add", ID = item.ID, Tags = new string[] { "new_tag", "another_tag" } },
new PocketAction() { Action = "archive", ID = item.ID }
});
Assert.True(success);
item = await client.Get(item.ID);
Assert.True(item.IsFavorite);
Assert.True(item.IsArchive);
Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "new_tag"));
Assert.NotNull(item.Tags.Single<PocketTag>(tag => tag.Name == "another_tag"));
}
[Fact]
public async Task AreMultipleAddActionsSent()
{
PocketItem item = await Setup();
bool success = await client.SendActions(new List<PocketAction>()
{
new PocketAction() { Action = "add", Uri = new Uri("http://msdn.microsoft.com/en-us/library/windows/apps/jj841126.aspx") },
new PocketAction() { Action = "add", Uri = new Uri("http://pokiapp.com/changelog") }
});
Assert.True(success);
}
[Fact]
public async Task AreMultipleActionsOnOneItemPerformed()
{
PocketItem item = await Setup();
bool success = await client.SendActions(new List<PocketAction>()
{
new PocketAction() { Action = "unarchive", ID = item.ID },
new PocketAction() { Action = "archive", ID = item.ID },
new PocketAction() { Action = "unfavorite", ID = item.ID }
});
Assert.True(success);
item = await client.Get(item.ID);
Assert.False(item.IsFavorite);
Assert.True(item.IsArchive);
}
private async Task<PocketItem> Setup() private async Task<PocketItem> Setup()
{ {
PocketItem item = await client.Add( PocketItem item = await client.Add(
@@ -75,9 +135,9 @@ namespace PocketSharp.Tests
} }
private async Task<PocketItem> GetItemById(int id, bool archive = false) private async Task<PocketItem> GetItemById(string id, bool archive = false)
{ {
List<PocketItem> items = await client.Get(state: archive ? State.archive : State.unread); List<PocketItem> items = (await client.Get(state: archive ? State.archive : State.unread)).ToList();
PocketItem itemDesired = null; PocketItem itemDesired = null;
items.ForEach(itm => items.ForEach(itm =>
+28 -119
View File
@@ -1,129 +1,38 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>netcoreapp2.0</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{CA3C491B-A8CA-426C-A0BB-E91636767467}</ProjectGuid> <IsPackable>false</IsPackable>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PocketSharp.Tests</RootNamespace>
<AssemblyName>PocketSharp.Tests</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
<IsCodedUITest>False</IsCodedUITest>
<TestProjectType>UnitTest</TestProjectType>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Threading.Tasks"> <None Remove="url-10000.csv" />
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\net45\Microsoft.Threading.Tasks.dll</HintPath> <None Remove="url-100000.csv" />
</Reference>
<Reference Include="Microsoft.Threading.Tasks.Extensions">
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\net45\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Net" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Extensions, Version=2.2.15.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Microsoft.Net.Http.2.2.15\lib\net45\System.Net.Http.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Primitives, Version=4.2.15.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\Microsoft.Net.Http.2.2.15\lib\net45\System.Net.Http.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="xunit">
<HintPath>..\packages\xunit.1.9.2\lib\net20\xunit.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
</ItemGroup>
</When>
<Otherwise />
</Choose>
<ItemGroup> <ItemGroup>
<Compile Include="AddTests.cs" /> <Content Include="url-10000.csv">
<Compile Include="AccountTests.cs" /> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Compile Include="ModifyTagsTests.cs" /> </Content>
<Compile Include="ModifyTests.cs" /> <Content Include="url-100000.csv">
<Compile Include="GetTests.cs" /> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Compile Include="Properties\AssemblyInfo.cs" /> </Content>
<Compile Include="ReadTests.cs" />
<Compile Include="TestsBase.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\PocketSharp\PocketSharp.csproj"> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<Project>{817200c3-a327-4e35-9b5f-63a51c088577}</Project> <PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<Name>PocketSharp</Name> <PackageReference Include="xunit" Version="2.4.1" />
</ProjectReference> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <ProjectReference Include="..\PocketSharp\PocketSharp.csproj" />
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"> </Project>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
</ItemGroup>
</When>
</Choose>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PocketSharp.Tests")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PocketSharp.Tests")]
[assembly: AssemblyCopyright("Copyright © 2013")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("87fcf138-5e6e-4584-ac3b-58c8ee6fccaa")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
-59
View File
@@ -1,59 +0,0 @@
using System;
using System.Threading.Tasks;
using Xunit;
using PocketSharp.Models;
using System.Diagnostics;
namespace PocketSharp.Tests
{
public class ReadTests : TestsBase
{
private PocketReader reader;
public ReadTests() : base()
{
reader = new PocketReader();
}
[Fact]
public async Task ReadArticleTest()
{
PocketArticle result = await reader.Read(new PocketItem()
{
ID = 99,
Uri = new Uri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation")
});
Assert.True(result.Content.Length > 15000);
}
[Fact]
public async Task ReadArticleWithInvalidUriTest()
{
await ThrowsAsync<PocketException>(async () =>
{
await reader.Read(new PocketItem()
{
ID = 99,
Uri = new Uri("http://frontendplayyyyy.com")
});
});
}
[Fact]
public async Task IsBodyOnlyProperlyResolved()
{
PocketArticle result = await reader.Read(new PocketItem()
{
ID = 99,
Uri = new Uri("http://calebjacob.com/tooltipster/")
});
Assert.True(result.Content.Substring(0, 4) == "<div");
}
}
}
+131
View File
@@ -0,0 +1,131 @@
using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
namespace PocketSharp.Tests
{
public class StressTests : TestsBase
{
private static IEnumerable<string> urls;
private static string[] tags = new string[] { "css", "js", "csharp", "windows", "microsoft" };
public StressTests()
: base()
{
// !! please don't misuse this account !!
client = new PocketClient(
consumerKey: "20000-786d0bc8c39294e9829111d6",
callbackUri: "http://frontendplay.com",
accessCode: "9b8ecb6b-7801-1a5c-7b39-2ba05b"
);
urls = File.ReadAllLines("../../url-100000.csv").Select(item => item.Split(',')[1]);
}
[Fact]
public async Task Are100ItemsRetrievedProperly()
{
IEnumerable<PocketItem> items = await client.Get(count: 100, state: State.all);
Assert.True(items.Count() == 100);
}
[Fact]
public async Task Are1000ItemsRetrievedProperly()
{
IEnumerable<PocketItem> items = await client.Get(count: 1000, state: State.all);
Assert.True(items.Count() == 1000);
}
[Fact]
public async Task Are2500ItemsRetrievedProperly()
{
IEnumerable<PocketItem> items = await client.Get(count: 2500, state: State.all);
Assert.True(items.Count() == 2500);
}
[Fact]
public async Task Are5000ItemsRetrievedProperly()
{
IEnumerable<PocketItem> items = await client.Get(count: 5000, state: State.all);
Assert.True(items.Count() == 5000);
}
[Fact]
public async Task IsSearchSuccessfullyOnBigList()
{
IEnumerable<PocketItem> items = await client.Get(search: "google");
Assert.True(items.Count() > 0);
Assert.True(items.First().Title.ToLower().Contains("google") || items.First().Uri.ToString().ToLower().Contains("google"));
}
[Fact]
public async Task IsTagSearchSuccessfullyOnBigList()
{
IEnumerable<PocketItem> items = await client.SearchByTag(tags[0]);
Assert.True(items.Count() > 1);
bool found = false;
items.First().Tags.ToList().ForEach(tag =>
{
if (tag.Name.Contains(tags[0]))
{
found = true;
}
});
Assert.True(found);
}
[Fact]
public async Task RetrieveTagsReturnsResultOnBigList()
{
List<PocketTag> items = (await client.GetTags()).ToList();
items.ForEach(tag =>
{
Assert.Contains(tag.Name, tags);
});
Assert.Equal(items.Count, tags.Length);
}
private async Task FillAccount(int offset, int count)
{
int r;
int r2;
string[] tag;
Random rnd = new Random();
var items = urls.Skip(offset).Take(count)
.Select((value, idx) => new { Value = value, Index = idx })
.GroupBy(item => item.Index / 100, item => item.Value)
.Cast<IEnumerable<string>>();
foreach (IEnumerable<string> urlGroup in items)
{
await Task.WhenAll(urlGroup.Select(url =>
{
r = rnd.Next(tags.Length);
r2 = rnd.Next(tags.Length);
tag = new string[] { tags[r], tags[r2] };
return client.Add(new Uri("http://" + url), tag);
}));
}
}
//[Fact]
//public async Task Fillll()
//{
// await FillAccount(11000, 89999);
//}
}
}
+3 -4
View File
@@ -1,8 +1,7 @@
using System; using System;
using System.Threading.Tasks;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit; using Xunit;
using PocketSharp.Models;
namespace PocketSharp.Tests namespace PocketSharp.Tests
{ {
@@ -10,7 +9,7 @@ namespace PocketSharp.Tests
{ {
protected PocketClient client; protected PocketClient client;
protected List<int> itemsToDelete = new List<int>(); protected List<string> itemsToDelete = new List<string>();
// setup // setup
@@ -26,7 +25,7 @@ namespace PocketSharp.Tests
// teardown // teardown
public void Dispose() public void Dispose()
{ {
itemsToDelete.ForEach(async id => itemsToDelete.ForEach(async id =>
{ {
+25
View File
@@ -0,0 +1,25 @@
using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
namespace PocketSharp.Tests
{
public class TrendingTests : TestsBase
{
[Fact]
public async Task AreTrendingArticlesReturned()
{
var articles = await client.GetTrendingArticles();
Assert.NotEmpty(articles);
}
[Fact]
public async Task AreTrendingTopicsReturned()
{
var topics = await client.GetTrendingTopics();
Assert.NotEmpty(topics);
}
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.15.0" newVersion="4.2.15.0" /> <bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Bcl" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="net45" />
<package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="net45" />
<package id="Microsoft.Net.Http" version="2.2.15" targetFramework="net45" />
<package id="xunit" version="1.9.2" targetFramework="net45" />
</packages>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+66 -89
View File
@@ -1,20 +1,9 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012 # Visual Studio 15
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp", "PocketSharp\PocketSharp.csproj", "{817200C3-A327-4E35-9B5F-63A51C088577}" VisualStudioVersion = 15.0.27130.2027
EndProject MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.Wpf", "PocketSharp.Examples\PocketSharp.Wpf\PocketSharp.Wpf.csproj", "{775569C2-987F-4AC4-8BA5-A315A21ED1B7}"
ProjectSection(ProjectDependencies) = postProject
{817200C3-A327-4E35-9B5F-63A51C088577} = {817200C3-A327-4E35-9B5F-63A51C088577}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PocketSharp.Examples", "PocketSharp.Examples", "{AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PocketSharp.Examples", "PocketSharp.Examples", "{AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.Silverlight", "PocketSharp.Examples\PocketSharp.Silverlight\PocketSharp.Silverlight.csproj", "{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.WP8", "PocketSharp.Examples\PocketSharp.WP8\PocketSharp.WP8.csproj", "{47721A56-2128-4C5A-8B92-995FFC353304}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.Tests", "PocketSharp.Tests\PocketSharp.Tests.csproj", "{CA3C491B-A8CA-426C-A0BB-E91636767467}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{19DD45B5-B849-49E7-89D6-16C89B9B96C7}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{19DD45B5-B849-49E7-89D6-16C89B9B96C7}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.nuget\NuGet.Config = .nuget\NuGet.Config .nuget\NuGet.Config = .nuget\NuGet.Config
@@ -22,98 +11,86 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{19DD45
.nuget\NuGet.targets = .nuget\NuGet.targets .nuget\NuGet.targets = .nuget\NuGet.targets
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NReadability", "PortablePorts\NReadability\NReadability.csproj", "{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PocketSharp.UWP", "PocketSharp.Examples\PocketSharp.UWP\PocketSharp.UWP.csproj", "{5CBB92EC-C1A2-4108-9A23-3B73DD138953}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SgmlReader", "PortablePorts\SgmlReader\SgmlReader.csproj", "{9112414C-E2D1-43BA-A298-A89F77D94332}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PocketSharp", "PocketSharp\PocketSharp.csproj", "{0E22926C-7244-4A17-923C-84B46F5149C0}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PortablePorts", "PortablePorts", "{82F79DE3-76D7-4FCB-AA7E-16BA7E363E0D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PocketSharp.Tests", "PocketSharp.Tests\PocketSharp.Tests.csproj", "{3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM Debug|ARM = Debug|ARM
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86 Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM Release|ARM = Release|ARM
Release|x64 = Release|x64
Release|x86 = Release|x86 Release|x86 = Release|x86
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{817200C3-A327-4E35-9B5F-63A51C088577}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|Any CPU.ActiveCfg = Debug|x86
{817200C3-A327-4E35-9B5F-63A51C088577}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|Any CPU.Build.0 = Debug|x86
{817200C3-A327-4E35-9B5F-63A51C088577}.Debug|ARM.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|Any CPU.Deploy.0 = Debug|x86
{817200C3-A327-4E35-9B5F-63A51C088577}.Debug|x86.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|ARM.ActiveCfg = Debug|ARM
{817200C3-A327-4E35-9B5F-63A51C088577}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|ARM.Build.0 = Debug|ARM
{817200C3-A327-4E35-9B5F-63A51C088577}.Release|Any CPU.Build.0 = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|ARM.Deploy.0 = Debug|ARM
{817200C3-A327-4E35-9B5F-63A51C088577}.Release|ARM.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x64.ActiveCfg = Debug|x64
{817200C3-A327-4E35-9B5F-63A51C088577}.Release|x86.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x64.Build.0 = Debug|x64
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x64.Deploy.0 = Debug|x64
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x86.ActiveCfg = Debug|x86
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x86.Build.0 = Debug|x86
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|ARM.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Debug|x86.Deploy.0 = Debug|x86
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|x86.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|Any CPU.ActiveCfg = Release|x86
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|ARM.ActiveCfg = Release|ARM
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|Any CPU.Build.0 = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|ARM.Build.0 = Release|ARM
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|ARM.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|ARM.Deploy.0 = Release|ARM
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|x86.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x64.ActiveCfg = Release|x64
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x64.Build.0 = Release|x64
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x64.Deploy.0 = Release|x64
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Debug|ARM.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x86.ActiveCfg = Release|x86
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Debug|x86.ActiveCfg = Debug|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x86.Build.0 = Release|x86
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {5CBB92EC-C1A2-4108-9A23-3B73DD138953}.Release|x86.Deploy.0 = Release|x86
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Release|Any CPU.Build.0 = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Release|ARM.ActiveCfg = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB}.Release|x86.ActiveCfg = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|ARM.ActiveCfg = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|ARM.Build.0 = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|Any CPU.Build.0 = Debug|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|x64.ActiveCfg = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|x64.Build.0 = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|ARM.ActiveCfg = Debug|ARM {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|x86.ActiveCfg = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|ARM.Build.0 = Debug|ARM {0E22926C-7244-4A17-923C-84B46F5149C0}.Debug|x86.Build.0 = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|ARM.Deploy.0 = Debug|ARM {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|x86.ActiveCfg = Debug|x86 {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|Any CPU.Build.0 = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|x86.Build.0 = Debug|x86 {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|ARM.ActiveCfg = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Debug|x86.Deploy.0 = Debug|x86 {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|ARM.Build.0 = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|Any CPU.ActiveCfg = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|x64.ActiveCfg = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|Any CPU.Build.0 = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|x64.Build.0 = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|Any CPU.Deploy.0 = Release|Any CPU {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|x86.ActiveCfg = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|ARM.ActiveCfg = Release|ARM {0E22926C-7244-4A17-923C-84B46F5149C0}.Release|x86.Build.0 = Release|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|ARM.Build.0 = Release|ARM {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|ARM.Deploy.0 = Release|ARM {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|x86.ActiveCfg = Release|x86 {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|ARM.ActiveCfg = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|x86.Build.0 = Release|x86 {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|ARM.Build.0 = Debug|Any CPU
{47721A56-2128-4C5A-8B92-995FFC353304}.Release|x86.Deploy.0 = Release|x86 {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|x64.ActiveCfg = Debug|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|x64.Build.0 = Debug|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Debug|Any CPU.Build.0 = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|x86.ActiveCfg = Debug|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Debug|ARM.ActiveCfg = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Debug|x86.Build.0 = Debug|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Debug|x86.ActiveCfg = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Release|Any CPU.ActiveCfg = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|Any CPU.Build.0 = Release|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Release|Any CPU.Build.0 = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|ARM.ActiveCfg = Release|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Release|ARM.ActiveCfg = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|ARM.Build.0 = Release|Any CPU
{CA3C491B-A8CA-426C-A0BB-E91636767467}.Release|x86.ActiveCfg = Release|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x64.ActiveCfg = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x64.Build.0 = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x86.ActiveCfg = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Debug|ARM.ActiveCfg = Debug|Any CPU {3BAA93AD-3B5C-47C4-816B-F29A1E6D1C2D}.Release|x86.Build.0 = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Debug|x86.ActiveCfg = Debug|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Release|Any CPU.Build.0 = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Release|ARM.ActiveCfg = Release|Any CPU
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2}.Release|x86.ActiveCfg = Release|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Debug|ARM.ActiveCfg = Debug|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Debug|x86.ActiveCfg = Debug|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Release|Any CPU.Build.0 = Release|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Release|ARM.ActiveCfg = Release|Any CPU
{9112414C-E2D1-43BA-A298-A89F77D94332}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{775569C2-987F-4AC4-8BA5-A315A21ED1B7} = {AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA} {5CBB92EC-C1A2-4108-9A23-3B73DD138953} = {AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA}
{656345D2-AF4C-4F88-9C9F-EBF54D7691DB} = {AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA} EndGlobalSection
{47721A56-2128-4C5A-8B92-995FFC353304} = {AFD4E3F1-B23C-4924-BA5B-D917FBADB8FA} GlobalSection(ExtensibilityGlobals) = postSolution
{9112414C-E2D1-43BA-A298-A89F77D94332} = {82F79DE3-76D7-4FCB-AA7E-16BA7E363E0D} SolutionGuid = {6B433CE4-D4DE-4360-80A1-DE2DB143DF0D}
{14C3EE6A-54A4-4A37-8B56-D52A3802F1C2} = {82F79DE3-76D7-4FCB-AA7E-16BA7E363E0D}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal
+62 -72
View File
@@ -1,7 +1,7 @@
using PocketSharp.Models; using PocketSharp.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
@@ -14,10 +14,11 @@ namespace PocketSharp
/// <summary> /// <summary>
/// Retrieves the requestCode from Pocket, which is used to generate the Authentication URI to authenticate the user /// Retrieves the requestCode from Pocket, which is used to generate the Authentication URI to authenticate the user
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="System.NullReferenceException">Authentication methods need a callbackUri on initialization of the PocketClient class</exception> /// <exception cref="System.NullReferenceException">Authentication methods need a callbackUri on initialization of the PocketClient class</exception>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<string> GetRequestCode() public async Task<string> GetRequestCode(CancellationToken cancellationToken = default(CancellationToken))
{ {
// check if request code is available // check if request code is available
if (CallbackUri == null) if (CallbackUri == null)
@@ -26,7 +27,7 @@ namespace PocketSharp
} }
// do request // do request
RequestCode response = await Request<RequestCode>("oauth/request", new Dictionary<string, string>() RequestCode response = await Request<RequestCode>("oauth/request", cancellationToken, new Dictionary<string, string>()
{ {
{ "redirect_uri", CallbackUri } { "redirect_uri", CallbackUri }
}, false); }, false);
@@ -48,45 +49,57 @@ namespace PocketSharp
public Uri GenerateAuthenticationUri(string requestCode = null) public Uri GenerateAuthenticationUri(string requestCode = null)
{ {
// check if request code is available // check if request code is available
if(RequestCode == null && requestCode == null) if (RequestCode == null && requestCode == null)
{ {
throw new NullReferenceException("Call GetRequestCode() first to receive a request_code"); throw new NullReferenceException("Call GetRequestCode() first to receive a request_code");
} }
// override property with given param if available // override property with given param if available
if(requestCode != null) if (requestCode != null)
{ {
RequestCode = requestCode; RequestCode = requestCode;
} }
return new Uri(string.Format(authentificationUri, RequestCode, CallbackUri)); return new Uri(String.Format(authentificationUri, RequestCode, CallbackUri, isMobileClient ? "1" : "0", "login", useInsideWebAuthenticationBroker ? "1" : "0"));
} }
/// <summary> /// <summary>
/// Requests the access code after authentication /// Generate registration URI from requestCode
/// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations. /// Follow the steps as with GenerateAuthenticationUri, but for unregistered users
/// </summary> /// </summary>
/// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param> /// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param>
/// <returns>The permanent access code, which is used to authenticate the user with the application</returns> /// <returns>A valid URI to redirect the user to.</returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception> /// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
/// <exception cref="PocketException"></exception> public Uri GenerateRegistrationUri(string requestCode = null)
[Obsolete("Please use GetUser instead")]
public async Task<string> GetAccessCode(string requestCode = null)
{ {
await GetUser(requestCode); // check if request code is available
return AccessCode; if (RequestCode == null && requestCode == null)
{
throw new NullReferenceException("Call GetRequestCode() first to receive a request_code");
}
// override property with given param if available
if (requestCode != null)
{
RequestCode = requestCode;
}
return new Uri(String.Format(authentificationUri, RequestCode, CallbackUri, isMobileClient ? "1" : "0", "signup", useInsideWebAuthenticationBroker ? "1" : "0"));
} }
/// <summary> /// <summary>
/// Requests the access code and username after authentication /// Requests the access code and username after authentication
/// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations. /// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="requestCode">The request code.</param> /// <param name="requestCode">The request code.</param>
/// <returns>The authenticated user</returns> /// <returns>
/// The authenticated user
/// </returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception> /// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
public async Task<PocketUser> GetUser(string requestCode = null) public async Task<PocketUser> GetUser(string requestCode = null, CancellationToken cancellationToken = default(CancellationToken))
{ {
// check if request code is available // check if request code is available
if (RequestCode == null && requestCode == null) if (RequestCode == null && requestCode == null)
@@ -101,70 +114,47 @@ namespace PocketSharp
} }
// do request // do request
PocketUser response = await Request<PocketUser>("oauth/authorize", new Dictionary<string, string>() GetUserResponse response = await Request<GetUserResponse>("oauth/authorize", cancellationToken, new Dictionary<string, string>()
{ {
{"code", RequestCode} { "code", RequestCode },
{ "account", "1" }
}, false); }, false);
// save code to client string avatar = response.Account?.Profile?.Avatar_url;
AccessCode = response.Code;
return response; PocketUser user = new PocketUser()
{
Username = response.Username,
Code = response.Access_token,
Id = response.Account?.User_id,
Email = response.Account?.Email,
FirstName = response.Account?.First_name,
LastName = response.Account?.Last_name,
Followers = response.Account?.Profile?.Follower_count ?? 0,
Follows = response.Account?.Profile?.Follow_count ?? 0,
Avatar = avatar != null ? new Uri(avatar, UriKind.Absolute) : null,
IsDefaultAvatar = avatar == null || avatar.Contains("pocket-profile-images."),
Description = response.Account?.Profile?.Description
};
// save code to client
AccessCode = user.Code;
return user;
} }
/// <summary> /// <summary>
/// Registers a new account. /// Get a new GUID from the Pocket API.
/// Account has to be activated via a activation email sent by Pocket.
/// </summary> /// </summary>
/// <param name="username">The username.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <param name="email">The email.</param> /// <returns>
/// <param name="password">The password.</param> /// The GUID
/// <returns></returns> /// </returns>
/// <exception cref="System.ArgumentNullException">All parameters are required</exception> public async Task<string> GetGuid(CancellationToken cancellationToken = default(CancellationToken))
/// <exception cref="System.FormatException">
/// Invalid email address.
/// or
/// Invalid username. Please only use letters, numbers, and/or dashes and between 1-20 characters.
/// or
/// Invalid password.
/// </exception>
/// <exception cref="PocketException"></exception>
public async Task<bool> RegisterAccount(string username, string email, string password)
{ {
if (username == null || email == null || password == null) GuidResponse response = await Request<GuidResponse>("guid", cancellationToken, requireAuth: false);
{ return response.Guid;
throw new ArgumentNullException("All parameters are required");
}
Match matchEmail = Regex.Match(email, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,10}))$");
Match matchUsername = Regex.Match(username, @"^([\w\-_]{1,20})$");
if (!matchEmail.Success)
{
throw new FormatException("(1) Invalid email address.");
}
if (!matchUsername.Success)
{
throw new FormatException("(2) Invalid username. Please only use letters, numbers, and/or dashes and between 1-20 characters.");
}
if (password.Length < 3)
{
throw new FormatException("(3) Invalid password.");
}
RegisterParameters parameters = new RegisterParameters()
{
Username = username,
Email = email,
Password = password
};
ResponseBase response = await Request<ResponseBase>("signup", parameters.Convert(), false);
return response.Status;
} }
} }
} }
+19 -3
View File
@@ -1,5 +1,6 @@
using PocketSharp.Models; using PocketSharp.Models;
using System; using System;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
@@ -16,10 +17,25 @@ namespace PocketSharp
/// <param name="tags">A comma-separated list of tags to apply to the item</param> /// <param name="tags">A comma-separated list of tags to apply to the item</param>
/// <param name="title">This can be included for cases where an item does not have a title, which is typical for image or PDF URLs. If Pocket detects a title from the content of the page, this parameter will be ignored.</param> /// <param name="title">This can be included for cases where an item does not have a title, which is typical for image or PDF URLs. If Pocket detects a title from the content of the page, this parameter will be ignored.</param>
/// <param name="tweetID">If you are adding Pocket support to a Twitter client, please send along a reference to the tweet status id. This allows Pocket to show the original tweet alongside the article.</param> /// <param name="tweetID">If you are adding Pocket support to a Twitter client, please send along a reference to the tweet status id. This allows Pocket to show the original tweet alongside the article.</param>
/// <returns>A simple representation of the saved item which doesn't contain all data (is only returned by calling the Retrieve method)</returns> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>
/// A simple representation of the saved item which doesn't contain all data (is only returned by calling the Retrieve method)
/// </returns>
/// <exception cref="System.FormatException">(1) Uri should be absolute.</exception>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<PocketItem> Add(Uri uri, string[] tags = null, string title = null, string tweetID = null) public async Task<PocketItem> Add(
Uri uri,
string[] tags = null,
string title = null,
string tweetID = null,
CancellationToken cancellationToken = default(CancellationToken)
)
{ {
if (!uri.IsAbsoluteUri)
{
throw new FormatException("(1) Uri should be absolute.");
}
AddParameters parameters = new AddParameters() AddParameters parameters = new AddParameters()
{ {
Uri = uri, Uri = uri,
@@ -28,7 +44,7 @@ namespace PocketSharp
TweetID = tweetID TweetID = tweetID
}; };
Add response = await Request<Add>("add", parameters.Convert()); Add response = await Request<Add>("add", cancellationToken, parameters.Convert());
return response.Item; return response.Item;
} }
+101
View File
@@ -0,0 +1,101 @@
//using HtmlAgilityPack;
//using PocketSharp.Models;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Threading;
//using System.Threading.Tasks;
//using System.Web;
//namespace PocketSharp
//{
// /// <summary>
// /// PocketClient
// /// </summary>
// public partial class PocketClient
// {
// /// <summary>
// /// Term to use for trending articles in the Explore() method
// /// </summary>
// const string EXPLORE_TRENDING = "trending";
// /// <summary>
// /// Term to use for must-read articles in the Explore() method
// /// </summary>
// const string EXPLORE_MUST_READS = "must-reads";
// /// <summary>
// /// Explore Pocket and find interesting articles by a certain topic
// /// </summary>
// /// <param name="topic">Term or topic to get articles for</param>
// /// <param name="cancellationToken"></param>
// /// <returns></returns>
// async Task<IEnumerable<PocketExploreItem>> Explore(string topic, CancellationToken cancellationToken = default(CancellationToken))
// {
// List<PocketExploreItem> items = new List<PocketExploreItem>();
// string html = await RequestAsString("https://getpocket.com/explore/" + HttpUtility.UrlEncode(topic), cancellationToken);
// var document = new HtmlDocument();
// document.LoadHtml(html);
// IEnumerable<HtmlNode> nodes = document.DocumentNode.SelectNodesByClass("media_item");
// if (nodes == null || !nodes.Any())
// {
// return items;
// }
// for (int i = 0; i < nodes.Count(); i++)
// {
// HtmlNode node = nodes.ElementAt(i);
// PocketExploreItem item = new PocketExploreItem();
// item.ID = node.Id;
// HtmlNode title = node.SelectNodeByClass("title")?.FirstChild;
// if (title == null)
// {
// continue;
// }
// // get uri
// string uri = title.GetAttributeValue("data-saveurl", null);
// item.Uri = new Uri(uri);
// // get image
// string imageUri = node.SelectNodeByClass("item_image")?.GetAttributeValue("data-thumburl", null);
// if (!String.IsNullOrEmpty(imageUri))
// {
// PocketImage image = new PocketImage();
// image.Uri = new Uri(imageUri);
// image.ID = "0";
// image.ItemID = item.ID;
// item.Images = new List<PocketImage>() { image };
// }
// // get basic infos
// item.Title = title.InnerText;
// item.Excerpt = node.SelectNodeByClass("excerpt")?.InnerText;
// item.IsTrending = node.SelectNodeByClass("flag-trending") != null;
// // save count
// string saveCountStr = node.SelectNodeByClass("save_count")?.InnerText?.Split(' ')?.FirstOrDefault();
// int saveCount = 0;
// Int32.TryParse(saveCountStr, out saveCount);
// item.SaveCount = saveCount;
// // add published date
// DateTime publishedDate = DateTime.Now;
// if (DateTime.TryParse(node.SelectNodeByClass("read_time")?.InnerText, out publishedDate))
// {
// item.PublishedTime = publishedDate;
// }
// items.Add(item);
// }
// return items;
// }
// }
//}
+126 -66
View File
@@ -1,8 +1,9 @@
using PocketSharp.Models; using PocketSharp.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
{ {
@@ -11,23 +12,24 @@ namespace PocketSharp
/// </summary> /// </summary>
public partial class PocketClient public partial class PocketClient
{ {
/// <summary> /// <summary>
/// Retrieves items from pocket /// Retrieves items from pocket
/// with the given filters /// with the given filters
/// </summary> /// </summary>
/// <param name="state">The state.</param> /// <param name="state">The state.</param>
/// <param name="favorite">The favorite.</param> /// <param name="favorite">The favorite.</param>
/// <param name="tag">The tag.</param> /// <param name="tag">The tag.</param>
/// <param name="contentType">Type of the content.</param> /// <param name="contentType">Type of the content.</param>
/// <param name="sort">The sort.</param> /// <param name="sort">The sort.</param>
/// <param name="search">The search.</param> /// <param name="search">The search.</param>
/// <param name="domain">The domain.</param> /// <param name="domain">The domain.</param>
/// <param name="since">The since.</param> /// <param name="since">The since.</param>
/// <param name="count">The count.</param> /// <param name="count">The count.</param>
/// <param name="offset">The offset.</param> /// <param name="offset">The offset.</param>
/// <returns></returns> /// <param name="cancellationToken">The cancellation token.</param>
/// <exception cref="PocketException"></exception> /// <returns></returns>
public async Task<List<PocketItem>> Get( /// <exception cref="PocketException"></exception>
public async Task<IEnumerable<PocketItem>> Get(
State? state = null, State? state = null,
bool? favorite = null, bool? favorite = null,
string tag = null, string tag = null,
@@ -37,7 +39,8 @@ namespace PocketSharp
string domain = null, string domain = null,
DateTime? since = null, DateTime? since = null,
int? count = null, int? count = null,
int? offset = null int? offset = null,
CancellationToken cancellationToken = default(CancellationToken)
) )
{ {
RetrieveParameters parameters = new RetrieveParameters() RetrieveParameters parameters = new RetrieveParameters()
@@ -50,14 +53,13 @@ namespace PocketSharp
DetailType = DetailType.complete, DetailType = DetailType.complete,
Search = search, Search = search,
Domain = domain, Domain = domain,
Since = since, Since = since.HasValue ? ((DateTime)since).ToUniversalTime() : since,
Count = count, Count = count,
Offset = offset Offset = offset,
Version = 2
}; };
Retrieve response = await Request<Retrieve>("get", parameters.Convert()); return (await Request<Retrieve>("get", cancellationToken, parameters.Convert())).Items ?? new List<PocketItem>();
return response.Items;
} }
@@ -66,15 +68,15 @@ namespace PocketSharp
/// Note: The Pocket API contains no method, which allows to retrieve a single item, so all items are retrieved and filtered locally by the ID. /// Note: The Pocket API contains no method, which allows to retrieve a single item, so all items are retrieved and filtered locally by the ID.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<PocketItem> Get(int itemID) public async Task<PocketItem> Get(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
List<PocketItem> items = await Get( return (await Get(
state: State.all cancellationToken: cancellationToken,
); state: State.all
)).SingleOrDefault<PocketItem>(item => item.ID == itemID);
return items.SingleOrDefault<PocketItem>(item => item.ID == itemID);
} }
@@ -82,13 +84,14 @@ namespace PocketSharp
/// Retrieves all items by a given filter /// Retrieves all items by a given filter
/// </summary> /// </summary>
/// <param name="filter">The filter.</param> /// <param name="filter">The filter.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<List<PocketItem>> Get(RetrieveFilter filter) public async Task<IEnumerable<PocketItem>> Get(RetrieveFilter filter, CancellationToken cancellationToken = default(CancellationToken))
{ {
RetrieveParameters parameters = new RetrieveParameters(); RetrieveParameters parameters = new RetrieveParameters();
switch(filter) switch (filter)
{ {
case RetrieveFilter.Article: case RetrieveFilter.Article:
parameters.ContentType = ContentType.article; parameters.ContentType = ContentType.article;
@@ -115,9 +118,19 @@ namespace PocketSharp
parameters.DetailType = DetailType.complete; parameters.DetailType = DetailType.complete;
Retrieve response = await Request<Retrieve>("get", parameters.Convert()); return (await Request<Retrieve>("get", cancellationToken, parameters.Convert())).Items;
}
return response.Items;
/// <summary>
/// Converts a raw JSON response to a PocketItem list
/// </summary>
/// <param name="itemsJSON">The raw JSON response.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public IEnumerable<PocketItem> ConvertJsonToList(string itemsJSON)
{
return DeserializeJson<Retrieve>(itemsJSON).Items;
} }
@@ -125,19 +138,22 @@ namespace PocketSharp
/// Retrieves all available tags. /// Retrieves all available tags.
/// Note: The Pocket API contains no method, which allows to retrieve all tags, so all items are retrieved and the associated tags extracted. /// Note: The Pocket API contains no method, which allows to retrieve all tags, so all items are retrieved and the associated tags extracted.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<List<PocketTag>> GetTags() public async Task<IEnumerable<PocketTag>> GetTags(CancellationToken cancellationToken = default(CancellationToken))
{ {
List<PocketItem> items = await Get( IEnumerable<PocketItem> items = await Get(
cancellationToken: cancellationToken,
state: State.all state: State.all
); );
return items.Where(item => item.Tags != null) return items
.SelectMany(item => item.Tags) .Where(item => item.Tags != null)
.GroupBy(item => item.Name) .SelectMany(item => item.Tags)
.Select(item => item.First()) .GroupBy(item => item.Name)
.ToList<PocketTag>(); .Select(item => item.First())
.ToList<PocketTag>();
} }
@@ -145,11 +161,16 @@ namespace PocketSharp
/// Retrieves items by tag /// Retrieves items by tag
/// </summary> /// </summary>
/// <param name="tag">The tag.</param> /// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<List<PocketItem>> SearchByTag(string tag) public async Task<IEnumerable<PocketItem>> SearchByTag(string tag, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Get(tag: tag); return await Get(
state: State.all,
cancellationToken: cancellationToken,
tag: tag
);
} }
@@ -157,36 +178,75 @@ namespace PocketSharp
/// Retrieves items which match the specified search string in title and URI /// Retrieves items which match the specified search string in title and URI
/// </summary> /// </summary>
/// <param name="searchString">The search string.</param> /// <param name="searchString">The search string.</param>
/// <param name="tag">Filter by tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="System.ArgumentOutOfRangeException">Search string length has to be a minimum of 2 chars</exception> /// <exception cref="System.ArgumentOutOfRangeException">Search string length has to be a minimum of 2 chars</exception>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<List<PocketItem>> Search(string searchString, bool searchInUri = true) public async Task<IEnumerable<PocketItem>> Search(string searchString, string tag = null, CancellationToken cancellationToken = default(CancellationToken))
{ {
List<PocketItem> items = await Get(RetrieveFilter.All); if (String.IsNullOrEmpty(searchString) || searchString.Length < 2)
return Search(items, searchString);
}
/// <summary>
/// Finds the specified search string in title and URI for an available list of items
/// </summary>
/// <param name="availableItems">The available items.</param>
/// <param name="searchString">The search string.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentOutOfRangeException">Search string length has to be a minimum of 2 chars</exception>
/// <exception cref="PocketException"></exception>
public List<PocketItem> Search(List<PocketItem> availableItems, string searchString)
{
if (searchString.Length < 2)
{ {
throw new ArgumentOutOfRangeException("Search string length has to be a minimum of 2 chars"); throw new ArgumentOutOfRangeException("Search string length has to be a minimum of 2 chars");
} }
return availableItems.Where(item => ( return await Get(
(!String.IsNullOrEmpty(item.FullTitle) && item.FullTitle.ToLower().Contains(searchString)) state: State.all,
|| item.Uri.ToString().ToLower().Contains(searchString) search: searchString,
)).ToList(); tag: tag,
cancellationToken: cancellationToken
);
}
/// <summary>
/// Retrieves the article content from an URI
/// WARNING:
/// You have to pass the parseUri in the PocketClient ctor for this method to work.
/// This is a private API and can only be used by authenticated users.
/// </summary>
/// <param name="uri">The article URI.</param>
/// <param name="includeImages">Include images into content or use placeholder.</param>
/// <param name="includeVideos">Include videos into content or use placeholder.</param>
/// <param name="forceRefresh">Force refresh of the content (don't use cache).</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<PocketArticle> GetArticle(Uri uri, bool includeImages = true, bool includeVideos = true, bool forceRefresh = false, CancellationToken cancellationToken = default(CancellationToken))
{
Dictionary<string, string> parameters = new Dictionary<string, string>()
{
{ "url", uri.OriginalString },
{ "images", includeImages ? "1" : "0" },
{ "videos", includeVideos ? "1" : "0" },
{ "refresh", forceRefresh ? "1" : "0" },
{ "output", "json" }
};
return await Request<PocketArticle>("", cancellationToken, parameters, false, true);
}
/// <summary>
/// Get article suggestions for an existing Pocket item.
/// </summary>
/// <param name="itemId">Get suggestions based on this item.</param>
/// <param name="count">Requested item count.</param>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<IEnumerable<PocketItem>> GetSuggestions(string itemId, int count = 3, string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken))
{
Dictionary<string, string> parameters = new Dictionary<string, string>()
{
{ "resolved_id", itemId },
{ "version", "1" },
{ "locale_lang", languageCode },
{ "count", count.ToString() }
};
return (await Request<Retrieve>("getSuggestedItems", cancellationToken, parameters)).Items ?? new List<PocketItem>();
} }
} }
+65 -23
View File
@@ -1,4 +1,7 @@
using PocketSharp.Models; using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
@@ -8,15 +11,44 @@ namespace PocketSharp
/// </summary> /// </summary>
public partial class PocketClient public partial class PocketClient
{ {
/// <summary>
/// Sends multiple actions in one request.
/// See: http://getpocket.com/developer/docs/v3/modify
/// </summary>
/// <param name="actions">The actions.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<bool> SendActions(IEnumerable<PocketAction> actions, CancellationToken cancellationToken = default(CancellationToken))
{
return await Send(actions, cancellationToken);
}
/// <summary>
/// Sends an action.
/// See: http://getpocket.com/developer/docs/v3/modify
/// </summary>
/// <param name="action">The action.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<bool> SendAction(PocketAction action, CancellationToken cancellationToken = default(CancellationToken))
{
return await Send(new List<PocketAction>() { action }, cancellationToken);
}
/// <summary> /// <summary>
/// Archives the specified item. /// Archives the specified item.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Archive(int itemID) public async Task<bool> Archive(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "archive"); return await SendDefault(cancellationToken, itemID, "archive");
} }
@@ -24,11 +56,12 @@ namespace PocketSharp
/// Archives the specified item. /// Archives the specified item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Archive(PocketItem item) public async Task<bool> Archive(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Archive(item.ID); return await Archive(item.ID, cancellationToken);
} }
@@ -36,11 +69,12 @@ namespace PocketSharp
/// Un-archives the specified item (alias for Readd). /// Un-archives the specified item (alias for Readd).
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Unarchive(int itemID) public async Task<bool> Unarchive(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "readd"); return await SendDefault(cancellationToken, itemID, "readd");
} }
@@ -48,11 +82,12 @@ namespace PocketSharp
/// Unarchives the specified item. /// Unarchives the specified item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Unarchive(PocketItem item) public async Task<bool> Unarchive(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Unarchive(item.ID); return await Unarchive(item.ID, cancellationToken);
} }
@@ -60,11 +95,12 @@ namespace PocketSharp
/// Favorites the specified item. /// Favorites the specified item.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Favorite(int itemID) public async Task<bool> Favorite(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "favorite"); return await SendDefault(cancellationToken, itemID, "favorite");
} }
@@ -72,11 +108,12 @@ namespace PocketSharp
/// Favorites the specified item. /// Favorites the specified item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Favorite(PocketItem item) public async Task<bool> Favorite(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Favorite(item.ID); return await Favorite(item.ID, cancellationToken);
} }
@@ -84,11 +121,12 @@ namespace PocketSharp
/// Un-favorites the specified item. /// Un-favorites the specified item.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Unfavorite(int itemID) public async Task<bool> Unfavorite(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "unfavorite"); return await SendDefault(cancellationToken, itemID, "unfavorite");
} }
@@ -96,50 +134,54 @@ namespace PocketSharp
/// Un-favorites the specified item. /// Un-favorites the specified item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Unfavorite(PocketItem item) public async Task<bool> Unfavorite(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Unfavorite(item.ID); return await Unfavorite(item.ID, cancellationToken);
} }
/// <summary> /// <summary>
/// Deletes the specified item. /// Deletes the specified item.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> Delete(int itemID) public async Task<bool> Delete(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "delete"); return await SendDefault(cancellationToken, itemID, "delete");
} }
/// <summary> /// <summary>
/// Deletes the specified item. /// Deletes the specified item.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> Delete(PocketItem item) public async Task<bool> Delete(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Delete(item.ID); return await Delete(item.ID, cancellationToken);
} }
/// <summary> /// <summary>
/// Puts an action /// Puts an action
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="action">The action.</param> /// <param name="action">The action.</param>
/// <returns></returns> /// <returns></returns>
protected async Task<bool> SendDefault(int itemID, string action) protected async Task<bool> SendDefault(CancellationToken cancellationToken, string itemID, string action)
{ {
return await Send(new ActionParameter() return await Send(new PocketAction()
{ {
Action = action, Action = action,
ID = itemID ID = itemID
}); }, cancellationToken);
} }
} }
} }
+60 -46
View File
@@ -1,4 +1,5 @@
using PocketSharp.Models; using PocketSharp.Models;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
@@ -13,11 +14,12 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> AddTags(int itemID, string[] tags) public async Task<bool> AddTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendTags(itemID, "tags_add", tags); return await SendTags(cancellationToken, itemID, "tags_add", tags);
} }
@@ -26,11 +28,12 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> AddTags(PocketItem item, string[] tags) public async Task<bool> AddTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await AddTags(item.ID, tags); return await AddTags(item.ID, tags, cancellationToken);
} }
@@ -39,11 +42,12 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTags(int itemID, string[] tags) public async Task<bool> RemoveTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendTags(itemID, "tags_remove", tags); return await SendTags(cancellationToken, itemID, "tags_remove", tags);
} }
@@ -52,11 +56,12 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="tags">The tag.</param> /// <param name="tags">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTags(PocketItem item, string[] tags) public async Task<bool> RemoveTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await RemoveTags(item.ID, tags); return await RemoveTags(item.ID, tags, cancellationToken);
} }
@@ -64,12 +69,13 @@ namespace PocketSharp
/// Removes a tag from an item. /// Removes a tag from an item.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="tags">The tag.</param> /// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTag(int itemID, string tag) public async Task<bool> RemoveTag(string itemID, string tag, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendTags(itemID, "tags_remove", new string[] { tag }); return await SendTags(cancellationToken, itemID, "tags_remove", new string[] { tag });
} }
@@ -77,12 +83,13 @@ namespace PocketSharp
/// Removes a tag from an item. /// Removes a tag from an item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="tags">The tags.</param> /// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTag(PocketItem item, string tag) public async Task<bool> RemoveTag(PocketItem item, string tag, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await RemoveTag(item.ID, tag); return await RemoveTag(item.ID, tag, cancellationToken);
} }
@@ -90,11 +97,12 @@ namespace PocketSharp
/// Clears all tags from an item. /// Clears all tags from an item.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTags(int itemID) public async Task<bool> RemoveTags(string itemID, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendDefault(itemID, "tags_clear"); return await SendDefault(cancellationToken, itemID, "tags_clear");
} }
@@ -102,11 +110,29 @@ namespace PocketSharp
/// Clears all tags from an item. /// Clears all tags from an item.
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RemoveTags(PocketItem item) public async Task<bool> RemoveTags(PocketItem item, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await RemoveTags(item.ID); return await RemoveTags(item.ID, cancellationToken);
}
/// <summary>
/// Deletes a tag. This will remove it from all affected items too.
/// </summary>
/// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<bool> DeleteTag(string tag, CancellationToken cancellationToken = default(CancellationToken))
{
return await Send(new PocketAction()
{
Action = "tag_delete",
Tag = tag
}, cancellationToken);
} }
@@ -115,11 +141,12 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> ReplaceTags(int itemID, string[] tags) public async Task<bool> ReplaceTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await SendTags(itemID, "tags_replace", tags); return await SendTags(cancellationToken, itemID, "tags_replace", tags);
} }
@@ -128,63 +155,50 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> ReplaceTags(PocketItem item, string[] tags) public async Task<bool> ReplaceTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await ReplaceTags(item.ID, tags); return await ReplaceTags(item.ID, tags, cancellationToken);
} }
/// <summary> /// <summary>
/// Renames a tag in an item. /// Renames a tag. This affects all items with this tag.
/// </summary> /// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="oldTag">The old tag.</param> /// <param name="oldTag">The old tag.</param>
/// <param name="newTag">The new tag name.</param> /// <param name="newTag">The new tag name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<bool> RenameTag(int itemID, string oldTag, string newTag) public async Task<bool> RenameTag(string oldTag, string newTag, CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Send(new ActionParameter() return await Send(new PocketAction()
{ {
Action = "tag_rename", Action = "tag_rename",
ID = itemID,
OldTag = oldTag, OldTag = oldTag,
NewTag = newTag NewTag = newTag
}); }, cancellationToken);
}
/// <summary>
/// Renames a tag in an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="oldTag">The old tag.</param>
/// <param name="newTag">The new tag name.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<bool> RenameTag(PocketItem item, string oldTag, string newTag)
{
return await RenameTag(item.ID, oldTag, newTag);
} }
/// <summary> /// <summary>
/// Puts the send action for tags. /// Puts the send action for tags.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <param name="itemID">The item ID.</param> /// <param name="itemID">The item ID.</param>
/// <param name="action">The action.</param> /// <param name="action">The action.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <returns></returns> /// <returns></returns>
protected async Task<bool> SendTags(int itemID, string action, string[] tags) protected async Task<bool> SendTags(CancellationToken cancellationToken, string itemID, string action, string[] tags)
{ {
return await Send(new ActionParameter() return await Send(new PocketAction()
{ {
Action = action, Action = action,
ID = itemID, ID = itemID,
Tags = tags Tags = tags
}); }, cancellationToken);
} }
} }
} }
+10 -16
View File
@@ -1,5 +1,6 @@
using PocketSharp.Models; using PocketSharp.Models;
using System; using System;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
@@ -12,23 +13,12 @@ namespace PocketSharp
/// <summary> /// <summary>
/// Statistics from the user account. /// Statistics from the user account.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<PocketStatistics> GetUserStatistics() public async Task<PocketStatistics> GetUserStatistics(CancellationToken cancellationToken = default(CancellationToken))
{ {
return await Request<PocketStatistics>("stats"); return await Request<PocketStatistics>("stats", cancellationToken);
}
/// <summary>
/// Statistics from the user account.
/// </summary>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
[Obsolete("Please use GetUserStatistics instead")]
public async Task<PocketStatistics> Statistics()
{
return await GetUserStatistics();
} }
@@ -37,16 +27,20 @@ namespace PocketSharp
/// If a request was made before, the data is returned synchronously from the cache. /// If a request was made before, the data is returned synchronously from the cache.
/// Note: This method only works for authenticated users with a given AccessCode. /// Note: This method only works for authenticated users with a given AccessCode.
/// </summary> /// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<PocketLimits> GetUsageLimits() public async Task<PocketLimits> GetUsageLimits(CancellationToken cancellationToken = default(CancellationToken))
{ {
string rateLimitForConsumerKey = TryGetHeaderValue(lastHeaders, "X-Limit-Key-Limit"); string rateLimitForConsumerKey = TryGetHeaderValue(lastHeaders, "X-Limit-Key-Limit");
if (rateLimitForConsumerKey == null) if (rateLimitForConsumerKey == null)
{ {
// this is the fastest way to do a non-failing request to receive the correct headers // this is the fastest way to do a non-failing request to receive the correct headers
await Get(count: 1); await Get(
cancellationToken: cancellationToken,
count: 1
);
} }
return new PocketLimits() return new PocketLimits()
+48
View File
@@ -0,0 +1,48 @@
using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace PocketSharp
{
/// <summary>
/// PocketClient
/// </summary>
public partial class PocketClient
{
/// <summary>
/// Get trending articles on Pocket.
/// </summary>
/// <param name="count">Article count.</param>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<IEnumerable<PocketItem>> GetTrendingArticles(int count = 20, string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken))
{
return (await Request<Retrieve>("getGlobalRecs", cancellationToken, new Dictionary<string, string>()
{
{ "locale_lang", languageCode },
{ "count", count.ToString() },
{ "version", "2" }
}, false)).Items ?? new List<PocketItem>();
}
/// <summary>
/// Get trending topics on Pocket.
/// </summary>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<IEnumerable<PocketTopic>> GetTrendingTopics(string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken))
{
return (await Request<TopicsResponse>("getTrendingTopics", cancellationToken, new Dictionary<string, string>()
{
{ "locale_lang", languageCode },
{ "version", "2" }
}, false)).Items ?? new List<PocketTopic>();
}
}
}
-89
View File
@@ -1,89 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Choose>
<When Condition="$(NCrunchOriginalSolutionDir) != '' And $(NCrunchOriginalSolutionDir) != '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(NCrunchOriginalSolutionDir)</FodySolutionDir>
</PropertyGroup>
</When>
<When Condition="$(SolutionDir) != '' And $(SolutionDir) != '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(SolutionDir)</FodySolutionDir>
</PropertyGroup>
</When>
<When Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(MSBuildProjectDirectory)\..\</FodySolutionDir>
</PropertyGroup>
</When>
</Choose>
<Choose>
<When Condition="$(KeyOriginatorFile) != '' And $(KeyOriginatorFile) != '*Undefined*'">
<PropertyGroup>
<FodyKeyFilePath>$(KeyOriginatorFile)</FodyKeyFilePath>
</PropertyGroup>
</When>
<When Condition="$(AssemblyOriginatorKeyFile) != '' And $(AssemblyOriginatorKeyFile) != '*Undefined*'">
<PropertyGroup>
<FodyKeyFilePath>$(AssemblyOriginatorKeyFile)</FodyKeyFilePath>
</PropertyGroup>
</When>
<Otherwise >
<PropertyGroup>
<FodyKeyFilePath></FodyKeyFilePath>
</PropertyGroup>
</Otherwise>
</Choose>
<PropertyGroup>
<IntermediateDir>$(ProjectDir)$(IntermediateOutputPath)</IntermediateDir>
<FodyMessageImportance Condition="$(FodyMessageImportance) == '' Or $(FodyMessageImportance) == '*Undefined*'">Low</FodyMessageImportance>
<FodySignAssembly Condition="$(FodySignAssembly) == '' Or $(FodySignAssembly) == '*Undefined*'">$(SignAssembly)</FodySignAssembly>
<FodyPath Condition="$(FodyPath) == '' Or $(FodyPath) == '*Undefined*'">$(MSBuildThisFileDirectory)</FodyPath>
</PropertyGroup>
<UsingTask
TaskName="Fody.WeavingTask"
AssemblyFile="$(FodyPath)\Fody.dll" />
<Target
AfterTargets="AfterCompile"
Name="WinFodyTarget"
Condition=" '$(OS)' == 'Windows_NT'">
<Fody.WeavingTask
AssemblyPath="@(IntermediateAssembly)"
IntermediateDir="$(IntermediateDir)"
KeyFilePath="$(FodyKeyFilePath)"
MessageImportance="$(FodyMessageImportance)"
ProjectDirectory="$(ProjectDir)"
SolutionDir="$(FodySolutionDir)"
References="@(ReferencePath)"
SignAssembly="$(FodySignAssembly)"
ReferenceCopyLocalPaths="@(ReferenceCopyLocalPaths)"
DefineConstants="$(DefineConstants)"
/>
</Target>
<Target
AfterTargets="AfterBuild"
Name="NonWinFodyTarget"
Condition=" '$(OS)' != 'Windows_NT'">
<Fody.WeavingTask
AssemblyPath="$(TargetPath)"
IntermediateDir="$(IntermediateDir)"
KeyFilePath="$(FodyKeyFilePath)"
MessageImportance="$(FodyMessageImportance)"
ProjectDirectory="$(ProjectDir)"
SolutionDir="$(FodySolutionDir)"
References="@(ReferencePath)"
SignAssembly="$(FodySignAssembly)"
ReferenceCopyLocalPaths="$(ReferenceCopyLocalPaths)"
DefineConstants="$(DefineConstants)"
/>
</Target>
<!--Support for ncrunch-->
<ItemGroup>
<None Include="$(FodyPath)\*.*" />
</ItemGroup>
</Project>
+512
View File
@@ -0,0 +1,512 @@
using PocketSharp.Models;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace PocketSharp
{
public interface IPocketClient
{
#region properties
/// <summary>
/// callback URLi for API calls
/// </summary>
/// <value>
/// The callback URI.
/// </value>
string CallbackUri { get; set; }
/// <summary>
/// Accessor for the Pocket API key
/// see: http://getpocket.com/developer
/// </summary>
/// <value>
/// The consumer key.
/// </value>
string ConsumerKey { get; set; }
/// <summary>
/// Code retrieved on authentification
/// </summary>
/// <value>
/// The request code.
/// </value>
string RequestCode { get; set; }
/// <summary>
/// Code retrieved on authentification-success
/// </summary>
/// <value>
/// The access code.
/// </value>
string AccessCode { get; set; }
/// <summary>
/// Action which is executed before every request
/// </summary>
/// <value>
/// The pre request callback.
/// </value>
Action<string> PreRequest { get; set; }
#endregion
#region account methods
/// <summary>
/// Retrieves the requestCode from Pocket, which is used to generate the Authentication URI to authenticate the user
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="System.NullReferenceException">Authentication methods need a callbackUri on initialization of the PocketClient class</exception>
/// <exception cref="PocketException"></exception>
Task<string> GetRequestCode(CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Generate Authentication URI from requestCode
/// </summary>
/// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param>
/// <returns>
/// A valid URI to redirect the user to.
/// </returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
Uri GenerateAuthenticationUri(string requestCode = null);
/// <summary>
/// Requests the access code and username after authentication
/// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations.
/// </summary>
/// <param name="requestCode">The request code.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>
/// The authenticated user
/// </returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
Task<PocketUser> GetUser(string requestCode = null, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Generate registration URI from requestCode
/// </summary>
/// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param>
/// <returns>A valid URI to redirect the user to.</returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
Uri GenerateRegistrationUri(string requestCode = null);
/// <summary>
/// Get a new GUID from the Pocket API.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>
/// The GUID
/// </returns>
Task<string> GetGuid(CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region add methods
/// <summary>
/// Adds a new item to pocket
/// </summary>
/// <param name="uri">The URL of the item you want to save</param>
/// <param name="tags">A comma-separated list of tags to apply to the item</param>
/// <param name="title">This can be included for cases where an item does not have a title, which is typical for image or PDF URLs. If Pocket detects a title from the content of the page, this parameter will be ignored.</param>
/// <param name="tweetID">If you are adding Pocket support to a Twitter client, please send along a reference to the tweet status id. This allows Pocket to show the original tweet alongside the article.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>
/// A simple representation of the saved item which doesn't contain all data (is only returned by calling the Retrieve method)
/// </returns>
/// <exception cref="System.FormatException">(1) Uri should be absolute.</exception>
/// <exception cref="PocketException"></exception>
Task<PocketItem> Add(Uri uri, string[] tags = null, string title = null, string tweetID = null, CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region get methods
/// <summary>
/// Retrieves items from pocket
/// with the given filters
/// </summary>
/// <param name="state">The state.</param>
/// <param name="favorite">The favorite.</param>
/// <param name="tag">The tag.</param>
/// <param name="contentType">Type of the content.</param>
/// <param name="sort">The sort.</param>
/// <param name="search">The search.</param>
/// <param name="domain">The domain.</param>
/// <param name="since">The since.</param>
/// <param name="count">The count.</param>
/// <param name="offset">The offset.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> Get(
State? state = null,
bool? favorite = null,
string tag = null,
ContentType? contentType = null,
Sort? sort = null,
string search = null,
string domain = null,
DateTime? since = null,
int? count = null,
int? offset = null,
CancellationToken cancellationToken = default(CancellationToken)
);
/// <summary>
/// Retrieves an item by a given ID
/// Note: The Pocket API contains no method, which allows to retrieve a single item, so all items are retrieved and filtered locally by the ID.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<PocketItem> Get(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Retrieves all items by a given filter
/// </summary>
/// <param name="filter">The filter.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> Get(RetrieveFilter filter, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Converts a raw JSON response to a PocketItem list
/// </summary>
/// <param name="itemsJSON">The raw JSON response.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
IEnumerable<PocketItem> ConvertJsonToList(string itemsJSON);
/// <summary>
/// Retrieves all available tags.
/// Note: The Pocket API contains no method, which allows to retrieve all tags, so all items are retrieved and the associated tags extracted.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketTag>> GetTags(CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Retrieves items by tag
/// </summary>
/// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> SearchByTag(string tag, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Retrieves items which match the specified search string in title and URI
/// </summary>
/// <param name="searchString">The search string.</param>
/// <param name="tag">Filter by tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentOutOfRangeException">Search string length has to be a minimum of 2 chars</exception>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> Search(string searchString, string tag = null, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Retrieves the article content from an URI
/// WARNING:
/// You have to pass the parseUri in the PocketClient ctor for this method to work.
/// This is a private API and can only be used by authenticated users.
/// </summary>
/// <param name="tag">The article URI.</param>
/// <param name="includeImages">Include images into content or use placeholder.</param>
/// <param name="includeVideos">Include videos into content or use placeholder.</param>
/// <param name="forceRefresh">Force refresh of the content (don't use cache).</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<PocketArticle> GetArticle(Uri uri, bool includeImages = true, bool includeVideos = true, bool forceRefresh = false, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get article suggestions for an existing Pocket item.
/// </summary>
/// <param name="itemId">Get suggestions based on this item.</param>
/// <param name="count">Requested item count.</param>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> GetSuggestions(string itemId, int count = 3, string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region modify methods
/// <summary>
/// Sends multiple actions in one request.
/// See: http://getpocket.com/developer/docs/v3/modify
/// </summary>
/// <param name="actions">The actions.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> SendActions(IEnumerable<PocketAction> actions, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Archives the specified item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Archive(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Archives the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Archive(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Un-archives the specified item (alias for Readd).
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Unarchive(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Unarchives the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Unarchive(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Favorites the specified item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Favorite(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Favorites the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Favorite(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Un-favorites the specified item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Unfavorite(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Un-favorites the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Unfavorite(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Deletes the specified item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> Delete(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Deletes the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
Task<bool> Delete(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region modify tags methods
/// <summary>
/// Adds the specified tags to an item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> AddTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Adds the specified tags to an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> AddTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes the specified tags from an item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes the specified tags from an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="tags">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes a tag from an item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTag(string itemID, string tag, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Removes a tag from an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTag(PocketItem item, string tag, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Clears all tags from an item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTags(string itemID, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Clears all tags from an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RemoveTags(PocketItem item, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Deletes a tag. This will remove it from all affected items too.
/// </summary>
/// <param name="tag">The tag.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> DeleteTag(string tag, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Replaces all existing tags with the given tags in an item.
/// </summary>
/// <param name="itemID">The item ID.</param>
/// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> ReplaceTags(string itemID, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Replaces all existing tags with the given new ones in an item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="tags">The tags.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> ReplaceTags(PocketItem item, string[] tags, CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Renames a tag. This affects all items with this tag.
/// </summary>
/// <param name="oldTag">The old tag.</param>
/// <param name="newTag">The new tag name.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<bool> RenameTag(string oldTag, string newTag, CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region statistics methods
/// <summary>
/// Statistics from the user account.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<PocketStatistics> GetUserStatistics(CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Returns API usage statistics.
/// If a request was made before, the data is returned synchronously from the cache.
/// Note: This method only works for authenticated users with a given AccessCode.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<PocketLimits> GetUsageLimits(CancellationToken cancellationToken = default(CancellationToken));
#endregion
#region explore/trending methods
/// <summary>
/// Get trending articles on Pocket.
/// Requires an active GUID from GetGuid() and will therefore make two HTTP requests.
/// </summary>
/// <param name="count">Article count.</param>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketItem>> GetTrendingArticles(int count = 20, string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Get trending topics on Pocket.
/// Requires an active GUID from GetGuid() and will therefore make two HTTP requests.
/// </summary>
/// <param name="languageCode">Two-letter language code for language-specific results.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
Task<IEnumerable<PocketTopic>> GetTrendingTopics(string languageCode = "en", CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// Explore Pocket and find interesting articles by a certain topic
/// </summary>
/// <param name="topic">Term or topic to get articles for</param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
// Task<IEnumerable<PocketExploreItem>> Explore(string topic, CancellationToken cancellationToken = default(CancellationToken));
#endregion
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
void Dispose();
}
}
@@ -16,6 +16,6 @@ namespace PocketSharp.Models
/// The actions. /// The actions.
/// </value> /// </value>
[DataMember(Name = "actions")] [DataMember(Name = "actions")]
public List<Dictionary<string, string>> Actions { get; set; } public IEnumerable<Dictionary<string, string>> Actions { get; set; }
} }
} }
+20 -10
View File
@@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Runtime.Serialization; using System.Runtime.Serialization;
@@ -23,16 +23,26 @@ namespace PocketSharp.Models
Dictionary<string, string> parameterDict = new Dictionary<string, string>(); Dictionary<string, string> parameterDict = new Dictionary<string, string>();
// get object properties // get object properties
IEnumerable<PropertyInfo> properties = this.GetType() IEnumerable<MemberInfo> properties = this.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public) .GetTypeInfo()
.Where(p => Attribute.IsDefined(p, typeof(DataMemberAttribute))); .DeclaredMembers
.Where(p => p.CustomAttributes.FirstOrDefault(a => a.AttributeType == typeof(DataMemberAttribute)) != null);
// gather attributes of object // gather attributes of object
foreach (PropertyInfo propertyInfo in properties) foreach (MemberInfo memberInfo in properties)
{ {
DataMemberAttribute attribute = (DataMemberAttribute)propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault(); DataMemberAttribute attribute = (DataMemberAttribute)memberInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault();
string name = attribute.Name ?? propertyInfo.Name.ToLower(); string name = attribute.Name ?? memberInfo.Name.ToLower();
object value = propertyInfo.GetValue(this, null); object value = null;
if (memberInfo is FieldInfo)
{
value = ((FieldInfo)memberInfo).GetValue(this);
}
else
{
value = ((PropertyInfo)memberInfo).GetValue(this, null);
}
// invalid parameter // invalid parameter
if (value == null) if (value == null)
@@ -55,7 +65,7 @@ namespace PocketSharp.Models
// convert DateTime to UNIX timestamp // convert DateTime to UNIX timestamp
if (value is DateTime) if (value is DateTime)
{ {
value = (int)((DateTime)value - new DateTime(1970, 1, 1)).TotalSeconds; value = (int)((DateTime)value - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
} }
parameterDict.Add(name, value.ToString()); parameterDict.Add(name, value.ToString());
@@ -64,4 +74,4 @@ namespace PocketSharp.Models
return parameterDict; return parameterDict;
} }
} }
} }
@@ -1,39 +0,0 @@
using System.Runtime.Serialization;
namespace PocketSharp.Models
{
/// <summary>
/// All parameters which can be passed to register a user
/// </summary>
[DataContract]
internal class RegisterParameters : Parameters
{
/// <summary>
/// Gets or sets the username.
/// </summary>
/// <value>
/// The username.
/// </value>
[DataMember(Name = "username")]
public string Username { get; set; }
/// <summary>
/// Gets or sets the E-Mail.
/// </summary>
/// <value>
/// The E-Mail.
/// </value>
[DataMember(Name = "email")]
public string Email { get; set; }
/// <summary>
/// Gets or sets the password.
/// </summary>
/// <value>
/// The password.
/// </value>
[DataMember(Name = "password")]
public string Password { get; set; }
}
}

Some files were not shown because too many files have changed in this diff Show More