mirror of
https://gitlab.com/fabinfra/fabaccess/borepin.git
synced 2025-04-20 18:36:31 +02:00
Compare commits
99 Commits
Author | SHA1 | Date | |
---|---|---|---|
2eb90b095f | |||
b2bcaf9ac2 | |||
90ef10c90f | |||
e13432e8c1 | |||
464e8c0dc1 | |||
bad1d86242 | |||
ff9853b9d7 | |||
cd166944c8 | |||
8f6fd44b38 | |||
4404daac8b | |||
e505d06495 | |||
0dd9e1b458 | |||
f907d4d7e1 | |||
7dcaabf1bb | |||
e628493df8 | |||
483cc7204c | |||
d39e0078d0 | |||
9eb4dadadd | |||
2986da785e | |||
68546cbe38 | |||
|
2c71fc3949 | ||
|
6b46303607 | ||
|
c3fb9cd5fa | ||
|
b7c47b5177 | ||
|
7877d53f0b | ||
|
75da7b6534 | ||
|
f42bcfd3a1 | ||
|
d7e2a90a45 | ||
|
84413c3b67 | ||
|
5c14dd9972 | ||
|
825879a043 | ||
|
c8c07e502b | ||
|
bbbe3e7e2e | ||
|
1a7e4ed236 | ||
|
b9bb50df87 | ||
|
4790de0f78 | ||
|
092081e82d | ||
|
c6d6153932 | ||
|
b09c6dd507 | ||
|
b86ecf23a2 | ||
|
d737faa989 | ||
|
e9b2679418 | ||
|
f12d624fa1 | ||
|
38238ef9a6 | ||
|
2f80a17c79 | ||
|
c425e05e8b | ||
|
0e92447a3e | ||
|
2efeaefe18 | ||
|
b6402c78ab | ||
|
e396e82fbc | ||
|
1d0abbcff7 | ||
|
530112ccc6 | ||
|
1e2604486c | ||
|
2ce8113644 | ||
|
9c1d979111 | ||
|
cb00176849 | ||
|
7886fba5c7 | ||
|
0f8f424288 | ||
|
df07210c7e | ||
|
28687274c0 | ||
|
446dd850a3 | ||
|
6e436b5c8c | ||
|
492ed2e3ce | ||
|
16b9e60369 | ||
|
9147dcd632 | ||
|
8f5f210fcf | ||
|
eeea0ed681 | ||
|
ba5880e820 | ||
|
07d71c8b6b | ||
|
4f8d1aa68b | ||
|
41acdfe5ea | ||
|
bc945162a4 | ||
|
d58aeab736 | ||
|
c22ad5b90b | ||
|
94efe7d1af | ||
|
57e6b4aa5a | ||
|
a2d8e4d85a | ||
|
0a846482f0 | ||
|
b2cce15464 | ||
|
f78668879b | ||
|
85ae6767ae | ||
|
7f6d90c294 | ||
|
0259349d69 | ||
|
be3fc25507 | ||
|
fbf249c54e | ||
|
6338c5cc11 | ||
|
5b835c4fd5 | ||
|
7379b94feb | ||
|
6ec9cf9386 | ||
|
587c9c5908 | ||
|
e1c9078036 | ||
|
d53775bba5 | ||
|
65d01c2886 | ||
|
6114b45ad6 | ||
|
0d007c6b5e | ||
|
85eeaa15e9 | ||
|
d1ad50de33 | ||
|
f0ab2ecb8a | ||
|
27fe01b990 |
113
.gitlab-ci.yml
113
.gitlab-ci.yml
@ -1,5 +1,5 @@
|
||||
variables:
|
||||
VERSION_PATTERN: '/v\d+\.\d+(\.\d+)?/'
|
||||
VERSION_PATTERN: '/^v\d+\.\d+(\.\d+)?$/'
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
LIB_RELEASE_FOLDER: 'Borepin\Borepin\bin\Release'
|
||||
UWP_RELEASE_FOLDER: 'Borepin\Borepin.UWP\bin\x86\Release'
|
||||
@ -87,7 +87,7 @@ pack_Android_AAB:
|
||||
needs:
|
||||
- build_Android
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- fabinfra
|
||||
- internal
|
||||
@ -112,7 +112,7 @@ pack_Android_APK:
|
||||
needs:
|
||||
- build_Android
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- fabinfra
|
||||
- internal
|
||||
@ -133,12 +133,38 @@ pack_Android_APK:
|
||||
paths:
|
||||
- Borepin/Borepin.Android/bin/Release/org.fab_infra.fabaccess-Signed.apk
|
||||
|
||||
pack_FDroid_APK:
|
||||
stage: pack
|
||||
needs:
|
||||
- build_Android
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- fabinfra
|
||||
- internal
|
||||
- windows
|
||||
- powershell
|
||||
- xamarin
|
||||
before_script:
|
||||
- '$Env:VERSION_NUMBER="$CI_COMMIT_TAG".SubString(1)'
|
||||
- '$Env:BUILD_NUMBER="$CI_PIPELINE_ID"'
|
||||
- '$Env:ANDROID_PKG_FORMAT="apk"'
|
||||
script:
|
||||
- '& "$WIN_NUGET_PATH" restore'
|
||||
- '[System.IO.File]::WriteAllBytes("$(pwd)/fabaccess.keystore", [System.Convert]::FromBase64String($FDroidKeyStore))'
|
||||
- '& "$WIN_MSBUILD_PATH" /t:Restore /t:Borepin_Android:SetVersion /p:Configuration=Release /target:Borepin_Android /target:Borepin_Android:SignAndroidPackage /p:AndroidKeyStore="True" /p:AndroidSigningKeyStore="$(pwd)/fabaccess.keystore" /p:AndroidSigningKeyPass="$FDroidKeyStore_Password" /p:AndroidSigningKeyAlias="$FDroidKeyStore_ID" /p:AndroidSigningStorePass="$FDroidKeyStore_Password"'
|
||||
- 'rm "$(pwd)/fabaccess.keystore"'
|
||||
artifacts:
|
||||
expire_in: 1 week
|
||||
paths:
|
||||
- Borepin/Borepin.Android/bin/Release/org.fab_infra.fabaccess-Signed.apk
|
||||
|
||||
pack_iOS:
|
||||
stage: pack
|
||||
needs:
|
||||
- build_iOS
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- fabinfra
|
||||
- internal
|
||||
@ -162,7 +188,7 @@ deploy_Android_Internal:
|
||||
needs:
|
||||
- pack_Android_AAB
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- docker
|
||||
image: registry.gitlab.com/fabinfra/gtk-sharp-build:latest
|
||||
@ -180,35 +206,84 @@ deploy_Android_Internal:
|
||||
after_script:
|
||||
- 'rm play-store-credentials.json'
|
||||
|
||||
deploy_Android_APK:
|
||||
pages:
|
||||
stage: deploy
|
||||
needs:
|
||||
- pack_Android_APK
|
||||
- pack_FDroid_APK
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- docker
|
||||
image: registry.gitlab.com/fabinfra/gtk-sharp-build:latest
|
||||
image:
|
||||
name: ubuntu
|
||||
# name: registry.gitlab.com/fdroid/docker-executable-fdroidserver:master
|
||||
variables:
|
||||
LC_ALL: 'en_US.UTF-8'
|
||||
LANG: 'en_US.UTF-8'
|
||||
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
TZ: Europe/Berlin
|
||||
before_script:
|
||||
- 'apt-get update -yqq && apt-get install -yqq fdroidserver'
|
||||
- 'export VERSION_NUMBER=${CI_COMMIT_TAG:1}'
|
||||
- 'export BUILD_NUMBER="$CI_PIPELINE_ID"'
|
||||
- 'cp -r fdroid/* .'
|
||||
- 'echo "keystorepass: ${FDroidKeyStore_Password}" >> config.yml'
|
||||
- 'echo "keypass: ${FDroidKeyStore_Password}" >> config.yml'
|
||||
- 'echo ${FDroidKeyStore} | base64 -d > keystore.p12'
|
||||
# - 'cat config.yml'
|
||||
# - sha1sum keystore.p12
|
||||
script:
|
||||
- 'mkdir -p public'
|
||||
- 'cp Borepin/Borepin.Android/bin/Release/org.fab_infra.fabaccess-Signed.apk public/'
|
||||
- 'mkdir -p repo'
|
||||
- 'cp Borepin/Borepin.Android/bin/Release/org.fab_infra.fabaccess-Signed.apk repo/'
|
||||
- 'fdroid update'
|
||||
- 'mkdir -p public/fdroid'
|
||||
- 'cp -r repo public/fdroid/'
|
||||
- 'rm keystore.p12'
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
|
||||
upload_binaries:
|
||||
stage: deploy
|
||||
needs:
|
||||
- pack_Android_APK
|
||||
tags:
|
||||
- docker
|
||||
image: curlimages/curl:latest
|
||||
before_script: []
|
||||
cache: []
|
||||
script:
|
||||
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file Borepin/Borepin.Android/bin/Release/org.fab_infra.fabaccess-Signed.apk "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/borepin/${CI_COMMIT_TAG}/org.fab_infra.fabaccess-Signed.apk"'
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
|
||||
release_job:
|
||||
stage: deploy
|
||||
needs:
|
||||
- upload_binaries
|
||||
image: registry.gitlab.com/gitlab-org/release-cli:latest
|
||||
tags:
|
||||
- docker
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
- if: $CI_COMMIT_TAG =~ "release/.*"
|
||||
when: never
|
||||
when: manual
|
||||
script:
|
||||
- echo "Creating GitLab release…"
|
||||
release:
|
||||
name: "Borepin ${CI_COMMIT_TAG}"
|
||||
description: "GitLab CI auto-created release"
|
||||
tag_name: "release/${CI_COMMIT_TAG}"
|
||||
assets:
|
||||
links:
|
||||
- name: 'Borepin signed apk'
|
||||
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/borepin/${CI_COMMIT_TAG}/org.fab_infra.fabaccess-Signed.apk"
|
||||
|
||||
deploy_Android_Beta:
|
||||
stage: deploy
|
||||
needs:
|
||||
- deploy_Android_Internal
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
when: manual
|
||||
tags:
|
||||
- docker
|
||||
@ -231,7 +306,7 @@ deploy_Android_Production:
|
||||
needs:
|
||||
- deploy_Android_Beta
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
when: manual
|
||||
tags:
|
||||
- docker
|
||||
@ -254,7 +329,7 @@ deploy_iOS_Internal:
|
||||
needs:
|
||||
- pack_iOS
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
tags:
|
||||
- fabinfra
|
||||
- internal
|
||||
@ -281,7 +356,7 @@ deploy_iOS_Beta:
|
||||
needs:
|
||||
- pack_iOS
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
when: manual
|
||||
tags:
|
||||
- fabinfra
|
||||
@ -309,7 +384,7 @@ deploy_iOS_Production:
|
||||
needs:
|
||||
- deploy_iOS_Beta
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ /v\d+\.\d+(\.\d+)?/
|
||||
- if: $CI_COMMIT_TAG != null && $CI_COMMIT_TAG =~ $VERSION_PATTERN
|
||||
when: manual
|
||||
tags:
|
||||
- fabinfra
|
||||
|
212
Borepin.sln
212
Borepin.sln
@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.32002.261
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33122.133
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Borepin.UWP", "Borepin\Borepin.UWP\Borepin.UWP.csproj", "{664AA356-2920-4353-A80A-B89128011381}"
|
||||
EndProject
|
||||
@ -11,20 +11,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Borepin.iOS", "Borepin\Bore
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Borepin", "Borepin\Borepin\Borepin.csproj", "{F93856BD-0C8D-4469-A8DB-6E513002BFD7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Borepin.GTK", "Borepin\Borepin.GTK\Borepin.GTK.csproj", "{61D956D2-5819-4736-BBD8-AD8208DE6A62}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Borepin.macOS", "Borepin\Borepin.macOS\Borepin.macOS.csproj", "{3EC23FE7-395E-4BBC-B56B-9455354BDA34}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FabAccessAPI", "FabAccessAPI\FabAccessAPI.csproj", "{3251FCE9-FEA3-4662-8BEB-636BE6732D48}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "S22.Sasl", "external\SASL\S22.Sasl.csproj", "{7FEC3D5E-C240-41B6-BBFA-895C4F4D45CA}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FabAccessAPI_Test", "FabAccessAPI_Test\FabAccessAPI_Test.csproj", "{1C85978A-9FC0-4064-8399-FA2455C5EC2A}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC", "external\NFC\NFC\NFC.csproj", "{D53A98E8-48B5-4DCE-A98E-4623EE746E16}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime", "external\capnproto-dotnetcore\Capnp.Net.Runtime\Capnp.Net.Runtime.csproj", "{C587AAC3-50A7-4871-A50D-7880B6F24EF6}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Borepin_Test", "Borepin_Test\Borepin_Test.csproj", "{A959A406-91A5-4D81-B90D-EF022812D97D}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0EA0AA4A-A814-45A0-9EA7-E9147CCCCB6A}"
|
||||
@ -34,6 +26,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
||||
.gitmodules = .gitmodules
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Borepin.GTK", "Borepin\Borepin.GTK\Borepin.GTK.csproj", "{61D956D2-5819-4736-BBD8-AD8208DE6A62}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC", "external\NFC\NFC\NFC.csproj", "{AC068302-655B-46B8-BC8A-971A3D685437}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NFC.PCSC", "external\NFC\NFC.PCSC\NFC.PCSC.csproj", "{6E2927DD-791F-48FA-96E1-696611FB38EB}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime", "external\capnproto-dotnetcore\Capnp.Net.Runtime\Capnp.Net.Runtime.csproj", "{6CC49E97-4F07-43DE-A2AF-50914498A276}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -194,54 +194,6 @@ Global
|
||||
{F93856BD-0C8D-4469-A8DB-6E513002BFD7}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{F93856BD-0C8D-4469-A8DB-6E513002BFD7}.Release|x86.Build.0 = Release|Any CPU
|
||||
{F93856BD-0C8D-4469-A8DB-6E513002BFD7}.Release|x86.Deploy.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x64.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|x64.Build.0 = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{3EC23FE7-395E-4BBC-B56B-9455354BDA34}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3251FCE9-FEA3-4662-8BEB-636BE6732D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3251FCE9-FEA3-4662-8BEB-636BE6732D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3251FCE9-FEA3-4662-8BEB-636BE6732D48}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@ -314,54 +266,6 @@ Global
|
||||
{1C85978A-9FC0-4064-8399-FA2455C5EC2A}.Release|x64.Build.0 = Release|Any CPU
|
||||
{1C85978A-9FC0-4064-8399-FA2455C5EC2A}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{1C85978A-9FC0-4064-8399-FA2455C5EC2A}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D53A98E8-48B5-4DCE-A98E-4623EE746E16}.Release|x86.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C587AAC3-50A7-4871-A50D-7880B6F24EF6}.Release|x86.Build.0 = Release|Any CPU
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@ -386,6 +290,102 @@ Global
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A959A406-91A5-4D81-B90D-EF022812D97D}.Release|x86.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x64.Build.0 = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{61D956D2-5819-4736-BBD8-AD8208DE6A62}.Release|x86.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AC068302-655B-46B8-BC8A-971A3D685437}.Release|x86.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|x64.Build.0 = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{6E2927DD-791F-48FA-96E1-696611FB38EB}.Release|x86.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|x64.Build.0 = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{6CC49E97-4F07-43DE-A2AF-50914498A276}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -16,7 +16,7 @@
|
||||
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
|
||||
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
|
||||
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
|
||||
<TargetFrameworkVersion>v11.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v13.0</TargetFrameworkVersion>
|
||||
<AndroidEnableSGenConcurrent>true</AndroidEnableSGenConcurrent>
|
||||
<AndroidUseAapt2>true</AndroidUseAapt2>
|
||||
<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
|
||||
@ -67,7 +67,7 @@
|
||||
<PackageReference Include="Prism.DryIoc.Forms">
|
||||
<Version>8.1.97</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2401" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2545" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.7.3" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -76,11 +76,7 @@
|
||||
<Compile Include="PlatformInitializer.cs" />
|
||||
<Compile Include="Resources\Resource.designer.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Services\APIBinder.cs" />
|
||||
<Compile Include="Services\APIBindedService.cs" />
|
||||
<Compile Include="Services\APIService.cs" />
|
||||
<Compile Include="Services\APIService_New.cs" />
|
||||
<Compile Include="Services\APIServiceConnection.cs" />
|
||||
<Compile Include="Services\BrowserService.cs" />
|
||||
<Compile Include="Services\PreferenceStorageService.cs" />
|
||||
<Compile Include="Services\SecretStorage.cs" />
|
||||
|
@ -1,12 +1,23 @@
|
||||
|
||||
using Android.App;
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.Content.PM;
|
||||
using Android.OS;
|
||||
using AndroidX.AppCompat.App;
|
||||
|
||||
namespace Borepin.Droid
|
||||
{
|
||||
[Activity(Theme = "@style/MainTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
|
||||
[Activity(Theme = "@style/MainTheme", LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, Exported = true)]
|
||||
[IntentFilter(
|
||||
new[]
|
||||
{
|
||||
"android.nfc.action.NDEF_DISCOVERED",
|
||||
},
|
||||
Categories = new[]
|
||||
{
|
||||
Intent.CategoryDefault
|
||||
},
|
||||
DataScheme = "fabaccess"
|
||||
)]
|
||||
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
|
||||
{
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
@ -24,6 +35,15 @@ namespace Borepin.Droid
|
||||
Xamarin.Forms.Forms.Init(this, savedInstanceState);
|
||||
LoadApplication(new App(new PlatformInitializer()));
|
||||
}
|
||||
protected override void OnNewIntent(Intent intent)
|
||||
{
|
||||
if(intent.Action == "android.nfc.action.NDEF_DISCOVERED")
|
||||
{
|
||||
intent.SetAction(Intent.ActionView);
|
||||
}
|
||||
|
||||
base.OnNewIntent(intent);
|
||||
}
|
||||
|
||||
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
|
||||
{
|
||||
|
@ -7,9 +7,9 @@ namespace Borepin.Droid
|
||||
[Application(Label = "FabAccess", Icon = "@mipmap/ic_launcher")]
|
||||
public class MainApplication : Application
|
||||
{
|
||||
public MainApplication(IntPtr javaReference, JniHandleOwnership transfer)
|
||||
: base(javaReference, transfer)
|
||||
public MainApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ namespace Borepin.Droid
|
||||
containerRegistry.Register<ISecretStorageService, SecretStorage>();
|
||||
containerRegistry.Register<IVersioningService, VersioningService>();
|
||||
containerRegistry.Register<IBrowserService, BrowserService>();
|
||||
// TODO containerRegistry.Register<INFCService, NFCService>();
|
||||
|
||||
containerRegistry.RegisterSingleton<IAPIService, APIService>();
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.fab_infra.fabaccess" android:installLocation="auto">
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" />
|
||||
<application android:theme="@style/MainTheme" android:label="FabAccess" android:networkSecurityConfig="@xml/network_security_config"></application>
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
|
||||
<application android:theme="@style/MainTheme" android:label="FabAccess" android:networkSecurityConfig="@xml/network_security_config">
|
||||
|
||||
</application>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.FLASHLIGHT" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.BIND_NFC_SERVICE" />
|
||||
</manifest>
|
@ -27,6 +27,7 @@ using Android.App;
|
||||
// Add some common permissions, these can be removed if not needed
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
|
||||
[assembly: UsesPermission(Android.Manifest.Permission.Nfc)]
|
||||
|
||||
//#if DEBUG
|
||||
//[assembly: Application(Debuggable=true)]
|
||||
|
37488
Borepin/Borepin.Android/Resources/Resource.designer.cs
generated
37488
Borepin/Borepin.Android/Resources/Resource.designer.cs
generated
File diff suppressed because it is too large
Load Diff
@ -1,50 +0,0 @@
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using FabAccessAPI;
|
||||
|
||||
namespace Borepin.Droid.Services
|
||||
{
|
||||
[Service(Name= "org.fab_infra.fabaccess.APIService")]
|
||||
public class APIBindedService : Android.App.Service
|
||||
{
|
||||
#region Private Members
|
||||
private IAPI _API;
|
||||
#endregion
|
||||
|
||||
#region Members
|
||||
public IBinder Binder { get; private set; }
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
public IAPI GetAPI()
|
||||
{
|
||||
return _API;
|
||||
}
|
||||
|
||||
public override void OnCreate()
|
||||
{
|
||||
base.OnCreate();
|
||||
_API = new API();
|
||||
}
|
||||
|
||||
public override IBinder OnBind(Intent intent)
|
||||
{
|
||||
Binder = new APIBinder(this);
|
||||
return Binder;
|
||||
}
|
||||
|
||||
public override bool OnUnbind(Intent intent)
|
||||
{
|
||||
return base.OnUnbind(intent);
|
||||
}
|
||||
|
||||
public override void OnDestroy()
|
||||
{
|
||||
Binder = null;
|
||||
_API = null;
|
||||
base.OnDestroy();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using Android.OS;
|
||||
|
||||
namespace Borepin.Droid.Services
|
||||
{
|
||||
public class APIBinder : Binder
|
||||
{
|
||||
#region Constructors
|
||||
public APIBinder(APIBindedService service)
|
||||
{
|
||||
Service = service;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Members
|
||||
public APIBindedService Service { get; private set; }
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using FabAccessAPI;
|
||||
|
||||
namespace Borepin.Droid.Services
|
||||
{
|
||||
class APIServiceConnection : Java.Lang.Object, IServiceConnection
|
||||
{
|
||||
#region Members
|
||||
public bool IsConnected
|
||||
{
|
||||
get
|
||||
{
|
||||
return Binder != null;
|
||||
}
|
||||
}
|
||||
public APIBinder Binder { get; private set; } = null;
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
public void OnServiceConnected(ComponentName name, IBinder service)
|
||||
{
|
||||
Binder = service as APIBinder;
|
||||
}
|
||||
|
||||
public void OnServiceDisconnected(ComponentName name)
|
||||
{
|
||||
Binder = null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Borepin.Service;
|
||||
using FabAccessAPI;
|
||||
|
||||
namespace Borepin.Droid.Services
|
||||
{
|
||||
public class APIService_New : IAPIService
|
||||
{
|
||||
#region Private Members
|
||||
private readonly APIServiceConnection _APIServiceConnection;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public APIService_New()
|
||||
{
|
||||
Context context = Application.Context;
|
||||
Intent service = new Intent(context, typeof(APIBindedService));
|
||||
context.BindService(service, _APIServiceConnection, Bind.AutoCreate);
|
||||
}
|
||||
#endregion
|
||||
|
||||
public IAPI GetAPI()
|
||||
{
|
||||
return _APIServiceConnection?.Binder?.Service?.GetAPI();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
@ -42,8 +42,8 @@
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\GtkSharp\2.12\lib\gtk-sharp-2.0\atk-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DryIoc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=dfbf2bd50fcf7768, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\DryIoc.dll.5.1.0\lib\net45\DryIoc.dll</HintPath>
|
||||
<Reference Include="DryIoc, Version=4.8.8.0, Culture=neutral, PublicKeyToken=dfbf2bd50fcf7768, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\DryIoc.dll.5.3.1\lib\net45\DryIoc.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
@ -93,19 +93,19 @@
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="webkit-sharp, Version=1.1.15.0, Culture=neutral, PublicKeyToken=eaa1d335d2e19745, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.5.0.0.2478\lib\net45\webkit-sharp.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.5.0.0.2545\lib\net45\webkit-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\netstandard2.0\Xamarin.Forms.Core.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\netstandard2.0\Xamarin.Forms.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\netstandard2.0\Xamarin.Forms.Platform.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\netstandard2.0\Xamarin.Forms.Platform.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform.GTK, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.5.0.0.2478\lib\net45\Xamarin.Forms.Platform.GTK.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.Platform.GTK.5.0.0.2545\lib\net45\Xamarin.Forms.Platform.GTK.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\netstandard2.0\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\netstandard2.0\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@ -132,10 +132,10 @@
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets')" />
|
||||
</Project>
|
@ -12,7 +12,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="DryIoc" publicKeyToken="dfbf2bd50fcf7768" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.8.8.0" newVersion="4.8.8.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
@ -1,11 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="DryIoc.dll" version="5.1.0" targetFramework="net48" />
|
||||
<package id="DryIoc.dll" version="4.8.8" targetFramework="net48" />
|
||||
<package id="NLog" version="5.0.0" targetFramework="net46" />
|
||||
<package id="OpenTK" version="3.2" targetFramework="net48" />
|
||||
<package id="Prism.Core" version="8.1.97" targetFramework="net48" />
|
||||
<package id="Prism.DryIoc.Forms" version="8.1.97" targetFramework="net48" />
|
||||
<package id="Prism.Forms" version="8.1.97" targetFramework="net48" />
|
||||
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
|
||||
<package id="Xamarin.Forms" version="5.0.0.2478" targetFramework="net48" />
|
||||
<package id="Xamarin.Forms.Platform.GTK" version="5.0.0.2478" targetFramework="net48" />
|
||||
<package id="Xamarin.Forms" version="5.0.0.2545" targetFramework="net48" />
|
||||
<package id="Xamarin.Forms.Platform.GTK" version="5.0.0.2545" targetFramework="net48" />
|
||||
</packages>
|
@ -9,7 +9,7 @@
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Borepin.UWP</RootNamespace>
|
||||
<AssemblyName>Borepin.UWP</AssemblyName>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<DefaultLanguage>en</DefaultLanguage>
|
||||
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
|
||||
<TargetPlatformVersion>10.0.19041.0</TargetPlatformVersion>
|
||||
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
|
||||
@ -17,8 +17,15 @@
|
||||
<EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<AppxPackageSigningEnabled>false</AppxPackageSigningEnabled>
|
||||
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
|
||||
<AppxBundlePlatforms>x86|x64|arm</AppxBundlePlatforms>
|
||||
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
|
||||
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
|
||||
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
|
||||
<GenerateTestArtifacts>True</GenerateTestArtifacts>
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
|
||||
<PackageCertificateThumbprint>8BB0E624CAAF6E41BF034FE339F1AFA71F7ECBDE</PackageCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|ARM'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@ -181,15 +188,23 @@
|
||||
<PackageReference Include="Prism.DryIoc.Forms">
|
||||
<Version>8.1.97</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2401" />
|
||||
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="6.2.13" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2545" />
|
||||
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform" Version="6.2.14" />
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.7.3" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\external\capnproto-dotnetcore\Capnp.Net.Runtime\Capnp.Net.Runtime.csproj">
|
||||
<Project>{c587aac3-50a7-4871-a50d-7880b6f24ef6}</Project>
|
||||
<Project>{6cc49e97-4f07-43de-a2af-50914498a276}</Project>
|
||||
<Name>Capnp.Net.Runtime</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\external\NFC\NFC.PCSC\NFC.PCSC.csproj">
|
||||
<Project>{6e2927dd-791f-48fa-96e1-696611fb38eb}</Project>
|
||||
<Name>NFC.PCSC</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\external\NFC\NFC\NFC.csproj">
|
||||
<Project>{ac068302-655b-46b8-bc8a-971a3d685437}</Project>
|
||||
<Name>NFC</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\FabAccessAPI\FabAccessAPI.csproj">
|
||||
<Project>{3251FCE9-FEA3-4662-8BEB-636BE6732D48}</Project>
|
||||
<Name>FabAccessAPI</Name>
|
||||
@ -199,6 +214,9 @@
|
||||
<Name>Borepin</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Borepin.UWP_TemporaryKey.pfx" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '14.0' ">
|
||||
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
|
@ -8,8 +8,8 @@
|
||||
|
||||
<Identity
|
||||
Name="f215b420-e2fb-4eb5-b168-f1b60fafa95b"
|
||||
Publisher="CN=2833ec12-ed0f-435b-ac4f-ae4d727a0c82"
|
||||
Version="1.0.0.0" />
|
||||
Publisher="CN=FabInfraDev"
|
||||
Version="1.0.1.0" />
|
||||
|
||||
<mp:PhoneIdentity PhoneProductId="ec0cc741-fd3e-485c-81be-68815c480690" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
|
||||
|
||||
@ -53,5 +53,8 @@
|
||||
|
||||
<Capabilities>
|
||||
<Capability Name="internetClient" />
|
||||
<Capability Name="privateNetworkClientServer"/>
|
||||
<uap:Capability Name="sharedUserCertificates"/>
|
||||
<DeviceCapability Name="proximity"/>
|
||||
</Capabilities>
|
||||
</Package>
|
@ -5,6 +5,8 @@ using Borepin.Service.Storage;
|
||||
using Borepin.Service.Versioning;
|
||||
using Borepin.Service;
|
||||
using Borepin.Service.Browser;
|
||||
using NFC.PCSC;
|
||||
using NFC.Interfaces;
|
||||
|
||||
namespace Borepin.UWP
|
||||
{
|
||||
@ -16,6 +18,7 @@ namespace Borepin.UWP
|
||||
containerRegistry.Register<ISecretStorageService, SecretStorageService>();
|
||||
containerRegistry.Register<IVersioningService, VersioningService>();
|
||||
containerRegistry.Register<IBrowserService, BrowserService>();
|
||||
containerRegistry.Register<INFCService, NFCService>();
|
||||
|
||||
containerRegistry.RegisterSingleton<IAPIService, APIService>();
|
||||
}
|
||||
|
@ -189,7 +189,7 @@
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Essentials" Version="1.7.3" />
|
||||
<PackageReference Include="Xamarin.Forms">
|
||||
<Version>5.0.0.2401</Version>
|
||||
<Version>5.0.0.2545</Version>
|
||||
</PackageReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
|
||||
|
@ -42,5 +42,18 @@
|
||||
<string>Light</string>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>Please allow access to the camera to scan barcodes</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>FabAccess</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>fabaccess</string>
|
||||
</array>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -16,6 +16,7 @@ namespace Borepin.iOS
|
||||
containerRegistry.Register<ISecretStorageService, SecretStorageService>();
|
||||
containerRegistry.Register<IVersioningService, VersioningService>();
|
||||
containerRegistry.Register<IBrowserService, BrowserService>();
|
||||
// TODO containerRegistry.Register<INFCService, NFCService>();
|
||||
|
||||
containerRegistry.RegisterSingleton<IAPIService, APIService>();
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
@ -59,8 +59,8 @@
|
||||
</XamMacArch>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="DryIoc, Version=5.1.0.0, Culture=neutral, PublicKeyToken=dfbf2bd50fcf7768, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\DryIoc.dll.5.1.0\lib\netstandard2.1\DryIoc.dll</HintPath>
|
||||
<Reference Include="DryIoc, Version=5.3.1.0, Culture=neutral, PublicKeyToken=dfbf2bd50fcf7768, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\DryIoc.dll.5.3.1\lib\netstandard2.1\DryIoc.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Prism, Version=8.1.97.5141, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Prism.Core.8.1.97\lib\netstandard2.0\Prism.dll</HintPath>
|
||||
@ -74,16 +74,16 @@
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\Xamarin.Mac\Xamarin.Forms.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\Xamarin.Mac\Xamarin.Forms.Platform.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Platform.macOS, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\Xamarin.Mac\Xamarin.Forms.Platform.macOS.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Forms.Xaml, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2478\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
<HintPath>..\..\packages\Xamarin.Forms.5.0.0.2545\lib\Xamarin.Mac\Xamarin.Forms.Xaml.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Xamarin.Mac" />
|
||||
</ItemGroup>
|
||||
@ -131,10 +131,10 @@
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Mac\Xamarin.Mac.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.props'))" />
|
||||
<Error Condition="!Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2478\build\Xamarin.Forms.targets')" />
|
||||
<Import Project="..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.5.0.0.2545\build\Xamarin.Forms.targets')" />
|
||||
</Project>
|
@ -8,7 +8,7 @@
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="DryIoc" publicKeyToken="dfbf2bd50fcf7768" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.3.1.0" newVersion="5.3.1.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="DryIoc.dll" version="5.1.0" targetFramework="xamarinmac20" />
|
||||
<package id="DryIoc.dll" version="5.3.1" targetFramework="xamarinmac20" />
|
||||
<package id="Prism.Core" version="8.1.97" targetFramework="xamarinmac20" />
|
||||
<package id="Prism.DryIoc.Forms" version="8.1.97" targetFramework="xamarinmac20" />
|
||||
<package id="Prism.Forms" version="8.1.97" targetFramework="xamarinmac20" />
|
||||
<package id="System.Reflection.Emit.Lightweight" version="4.7.0" targetFramework="xamarinmac20" />
|
||||
<package id="Xamarin.Forms" version="5.0.0.2478" targetFramework="xamarinmac20" />
|
||||
<package id="Xamarin.Forms" version="5.0.0.2545" targetFramework="xamarinmac20" />
|
||||
</packages>
|
@ -12,6 +12,15 @@ using Borepin.PageModel.AddServerProcess;
|
||||
using System;
|
||||
using Borepin.Service.Storage;
|
||||
using NLog;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using Prism.Navigation.Xaml;
|
||||
using Prism.Navigation;
|
||||
using Borepin.Service;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Schema;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using Prism.Services;
|
||||
|
||||
namespace Borepin
|
||||
{
|
||||
@ -19,8 +28,8 @@ namespace Borepin
|
||||
{
|
||||
public App(IPlatformInitializer platformInitializer) : base(platformInitializer)
|
||||
{
|
||||
var config = new NLog.Config.LoggingConfiguration();
|
||||
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
|
||||
NLog.Config.LoggingConfiguration config = new NLog.Config.LoggingConfiguration();
|
||||
NLog.Targets.ConsoleTarget logconsole = new NLog.Targets.ConsoleTarget("logconsole");
|
||||
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logconsole);
|
||||
LogManager.Configuration = config;
|
||||
}
|
||||
@ -32,6 +41,52 @@ namespace Borepin
|
||||
await NavigationService.NavigateAsync(new Uri("https://borepin.fab-access.org/StartPage")).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
|
||||
protected override async void OnAppLinkRequestReceived(Uri uri)
|
||||
{
|
||||
IPageDialogService pageDialogService = Container.Resolve<IPageDialogService>();
|
||||
|
||||
if (uri.LocalPath.StartsWith("/resource/", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (Container.IsRegistered<IAPIService>() && Container.IsRegistered<ILoginStorageService>())
|
||||
{
|
||||
string resource_id = uri.LocalPath.Remove(0, "/resource/".Length);
|
||||
|
||||
IAPIService apiService = Container.Resolve<IAPIService>();
|
||||
IAPI api = apiService.GetAPI();
|
||||
|
||||
if (api.IsConnected)
|
||||
{
|
||||
Optional<Machine> optional = await api.Session.MachineSystem.Info.GetMachine(resource_id).ConfigureAwait(false);
|
||||
|
||||
if (optional.Just == null)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await pageDialogService.DisplayAlertAsync(Borepin.Resources.Text.TextResource.ALERT, Borepin.Resources.Text.TextResource.ALERT_ID, Borepin.Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
Prism.Navigation.NavigationParameters parameters = new Prism.Navigation.NavigationParameters
|
||||
{
|
||||
{ "instance", optional.Just.Id },
|
||||
};
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
INavigationResult result = await Container.Resolve<INavigationService>().NavigateAsync("/MainPage/NavigationPage/MachineListPage/MachinePage", parameters).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected override void RegisterTypes(IContainerRegistry containerRegistry)
|
||||
{
|
||||
#region Register Basic Navigation
|
||||
@ -50,6 +105,7 @@ namespace Borepin
|
||||
|
||||
containerRegistry.RegisterForNavigation<UserListPage, UserListPageModel>();
|
||||
containerRegistry.RegisterForNavigation<UserPage, UserPageModel>();
|
||||
containerRegistry.RegisterForNavigation<CreateCardPage, CreateCardPageModel>();
|
||||
containerRegistry.RegisterForNavigation<AddUserPage, AddUserPageModel>();
|
||||
containerRegistry.RegisterForNavigation<ProfilePage, ProfilePageModel>();
|
||||
#endregion
|
||||
@ -64,11 +120,11 @@ namespace Borepin
|
||||
|
||||
#region Register Dialog
|
||||
containerRegistry.RegisterDialog<ConfirmDialog, ConfirmDialogModel>();
|
||||
containerRegistry.RegisterDialog<ScanDialog, ScanDialogModel>();
|
||||
#endregion
|
||||
|
||||
#region Register Service
|
||||
containerRegistry.RegisterSingleton<ILoginStorageService, LoginStorageService>();
|
||||
containerRegistry.RegisterSingleton<IErrorMessageService, ErrorMessageService>();
|
||||
|
||||
// NEED PLATFORM SPECIFIC SERVICE
|
||||
// IPreferenceStorageService
|
||||
|
@ -1,5 +1,6 @@
|
||||
using Borepin.Service;
|
||||
using FabAccessAPI;
|
||||
using NLog;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
using System;
|
||||
@ -30,49 +31,29 @@ namespace Borepin.Base
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
public async void OnConnectionStatusChanged(object sender, ConnectionStatusChange args)
|
||||
public async void OnConnectionStatusChanged(object sender, ConnectionStatusChanged args)
|
||||
{
|
||||
switch(args)
|
||||
{
|
||||
case ConnectionStatusChange.Connected:
|
||||
case ConnectionStatusChanged.Connected:
|
||||
IsConnected = true;
|
||||
IsConnecting = false;
|
||||
try
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
catch(Exception exception)
|
||||
{
|
||||
IsConnected = false;
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
_API.UnbindAllEvents();
|
||||
Log.Warn("Load API Data failed", exception);
|
||||
}
|
||||
break;
|
||||
case ConnectionStatusChange.Reconnected:
|
||||
try
|
||||
{
|
||||
await ReloadAPIData().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
{
|
||||
case ConnectionStatusChanged.ConnectionLoss:
|
||||
IsConnected = false;
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
_API.UnbindAllEvents();
|
||||
}
|
||||
IsConnecting = true;
|
||||
break;
|
||||
case ConnectionStatusChange.ConnectionLoss:
|
||||
try
|
||||
{
|
||||
await _API.Reconnect().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
{
|
||||
IsConnected = false;
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
_API.UnbindAllEvents();
|
||||
}
|
||||
break;
|
||||
case ConnectionStatusChange.Disconnected:
|
||||
case ConnectionStatusChanged.Disconnected:
|
||||
IsConnected = false;
|
||||
IsConnecting = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -81,22 +62,28 @@ namespace Borepin.Base
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
public virtual Task ReloadAPIData()
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
/// <summary>
|
||||
/// PageModel is Connected
|
||||
/// </summary>
|
||||
private bool _IsConnected = true;
|
||||
private bool _IsConnected = false;
|
||||
public bool IsConnected
|
||||
{
|
||||
get => _IsConnected;
|
||||
set => SetProperty(ref _IsConnected, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PageModel is Connecting
|
||||
/// </summary>
|
||||
private bool _IsConnecting = false;
|
||||
public bool IsConnecting
|
||||
{
|
||||
get => _IsConnecting;
|
||||
set => SetProperty(ref _IsConnecting, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region INavigationAware
|
||||
@ -110,11 +97,9 @@ namespace Borepin.Base
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(false);
|
||||
}
|
||||
catch(Exception ex)
|
||||
catch(Exception exception)
|
||||
{
|
||||
IsConnected = false;
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
_API.UnbindAllEvents();
|
||||
Log.Warn("Load API Data failed", exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
11
Borepin/Borepin/Base/ErrorMessages.cs
Normal file
11
Borepin/Borepin/Base/ErrorMessages.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Borepin.Base
|
||||
{
|
||||
public static class ErrorMessages
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -31,15 +31,18 @@
|
||||
<None Remove="Properties\**" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="1.0.702">
|
||||
<None Remove="MultilingualResources\Borepin.de-DE.xlf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Meziantou.Analyzer" Version="1.0.756">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="NaturalSort.Extension" Version="3.2.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="NLog" Version="5.0.0" />
|
||||
<PackageReference Include="NaturalSort.Extension" Version="4.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
<PackageReference Include="NLog" Version="5.1.0" />
|
||||
<PackageReference Include="Prism.DryIoc.Forms" Version="8.1.97" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2401" />
|
||||
<PackageReference Include="Xamarin.Forms" Version="5.0.0.2545" />
|
||||
<PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
|
||||
<PackageReference Include="ZXing.Net.MobileX.Forms" Version="3.0.1" />
|
||||
</ItemGroup>
|
||||
@ -99,9 +102,6 @@
|
||||
<EmbeddedResource Update="Dialog\ConfirmDialog.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Update="Dialog\ScanDialog.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Update="Page\AddServerProcess\SelectServerPage.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
@ -114,6 +114,9 @@
|
||||
<EmbeddedResource Update="Page\AddUserPage.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Update="Page\CreateCardPage.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Update="Page\MachinePage.xaml">
|
||||
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
|
||||
</EmbeddedResource>
|
||||
@ -159,6 +162,10 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\external\NFC\NFC\NFC.csproj" />
|
||||
<ProjectReference Include="..\..\FabAccessAPI\FabAccessAPI.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<XliffResource Include="MultilingualResources\Borepin.de-DE.xlf" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
35
Borepin/Borepin/Converter/AllTrueBoolConverter.cs
Normal file
35
Borepin/Borepin/Converter/AllTrueBoolConverter.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Borepin.Converter
|
||||
{
|
||||
public class AllTrueBoolConverter : IMultiValueConverter
|
||||
{
|
||||
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (values == null || !targetType.IsAssignableFrom(typeof(bool)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (var value in values)
|
||||
{
|
||||
if (!(value is bool b))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (!b)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
xmlns:zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"
|
||||
x:Class="Borepin.Dialog.ScanDialog"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text">
|
||||
<ContentView.Content>
|
||||
<StackLayout IsVisible="{Binding IsVisible}">
|
||||
<zxing:ZXingScannerView Result="{Binding ScanResult, Mode=TwoWay}" ScanResultCommand="{Binding ScannedCommand}" IsScanning="{Binding IsScanning}" WidthRequest="300" HeightRequest="500" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.CANCEL}" Command="{Binding AbortCommand}"/>
|
||||
</StackLayout>
|
||||
</ContentView.Content>
|
||||
</ContentView>
|
@ -1,111 +0,0 @@
|
||||
using Prism.Commands;
|
||||
using Prism.Mvvm;
|
||||
using Prism.Services.Dialogs;
|
||||
using System;
|
||||
using System.Windows.Input;
|
||||
using ZXing;
|
||||
|
||||
namespace Borepin.DialogModel
|
||||
{
|
||||
public class ScanDialogModel : BindableBase, IDialogAware
|
||||
{
|
||||
#region Private Fields
|
||||
private object _Instance;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public ScanDialogModel()
|
||||
{
|
||||
AbortCommand = new DelegateCommand(AbortCommandExecute);
|
||||
ScannedCommand = new DelegateCommand(ScannedCommandExecute);
|
||||
|
||||
IsVisible = true;
|
||||
IsScanning = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
public event Action<IDialogParameters> RequestClose;
|
||||
|
||||
public bool CanCloseDialog()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
private Result _ScanResult;
|
||||
public Result ScanResult
|
||||
{
|
||||
get => _ScanResult;
|
||||
set => SetProperty(ref _ScanResult, value);
|
||||
}
|
||||
|
||||
private bool _IsScanning;
|
||||
public bool IsScanning
|
||||
{
|
||||
get => _IsScanning;
|
||||
set => SetProperty(ref _IsScanning, value);
|
||||
}
|
||||
|
||||
private bool _IsVisible;
|
||||
public bool IsVisible
|
||||
{
|
||||
get => _IsVisible;
|
||||
set => SetProperty(ref _IsVisible, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
private ICommand _ScannedCommand;
|
||||
|
||||
public ICommand ScannedCommand
|
||||
{
|
||||
get => _ScannedCommand;
|
||||
set => SetProperty(ref _ScannedCommand, value);
|
||||
}
|
||||
public void ScannedCommandExecute()
|
||||
{
|
||||
IsScanning = false;
|
||||
IsVisible = false;
|
||||
|
||||
IDialogParameters parameters = new DialogParameters()
|
||||
{
|
||||
{ "result", "scanned" },
|
||||
{ "value", ScanResult.Text },
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
|
||||
private ICommand _AbortCommand;
|
||||
public ICommand AbortCommand
|
||||
{
|
||||
get => _AbortCommand;
|
||||
set => SetProperty(ref _AbortCommand, value);
|
||||
}
|
||||
public void AbortCommandExecute()
|
||||
{
|
||||
IsScanning = false;
|
||||
IsVisible = false;
|
||||
|
||||
IDialogParameters parameters = new DialogParameters()
|
||||
{
|
||||
{ "result", "abort" },
|
||||
{ "instance", _Instance },
|
||||
};
|
||||
RequestClose(parameters);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IDialogAware
|
||||
public void OnDialogClosed()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDialogOpened(IDialogParameters parameters)
|
||||
{
|
||||
_Instance = parameters.GetValue<object>("instance");
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
68
Borepin/Borepin/Model/CardConfig.cs
Normal file
68
Borepin/Borepin/Model/CardConfig.cs
Normal file
@ -0,0 +1,68 @@
|
||||
using NFC.Helper;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public class CardConfig
|
||||
{
|
||||
#region Constructors
|
||||
public CardConfig()
|
||||
{
|
||||
PICCKey = GenerateEmptyKey();
|
||||
APPKey = GenerateEmptyKey();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
public string UserID;
|
||||
|
||||
public byte[] PICCKey;
|
||||
public byte[] APPKey;
|
||||
|
||||
public bool DoFormat;
|
||||
|
||||
public byte[] CardToken;
|
||||
public byte[] MetaInfo;
|
||||
public byte[] SpaceInfo;
|
||||
#endregion
|
||||
|
||||
#region Mehtods
|
||||
public string ConvertToString(byte[] array)
|
||||
{
|
||||
string data = HexConverter.ConvertToHexString(array);
|
||||
data = data.ToUpper(CultureInfo.InvariantCulture);
|
||||
|
||||
for(int i = 2; i < data.Length; i += 3)
|
||||
{
|
||||
data = data.Insert(i, " ");
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public byte[] ConvertFromString(string data)
|
||||
{
|
||||
data = data.Trim();
|
||||
data = data.Replace(" ", "");
|
||||
|
||||
byte[] array = HexConverter.ConvertFromHexString(data);
|
||||
return array;
|
||||
}
|
||||
|
||||
public byte[] GenerateRandomKey()
|
||||
{
|
||||
byte[] key = ByteOperation.GenerateEmptyArray(16);
|
||||
RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider();
|
||||
cryptoProvider.GetBytes(key);
|
||||
return key;
|
||||
}
|
||||
|
||||
public byte[] GenerateEmptyKey()
|
||||
{
|
||||
return ByteOperation.GenerateEmptyArray(16);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
63
Borepin/Borepin/Model/DESFireInterfaceDummy.cs
Normal file
63
Borepin/Borepin/Model/DESFireInterfaceDummy.cs
Normal file
@ -0,0 +1,63 @@
|
||||
using Borepin.Page;
|
||||
using FabAccessAPI.Schema;
|
||||
using ImTools;
|
||||
using NFC.Helper;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public class DESFireInterfaceDummy : User.ICardDESFireInterface
|
||||
{
|
||||
public Task Bind(IReadOnlyList<byte> token, IReadOnlyList<byte> auth_key, CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<byte>> GenCardToken(CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
List<byte> token = new List<byte>();
|
||||
token.AddRange(HexConverter.ConvertFromHexString("11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11".Replace(" ", "")));
|
||||
return Task.FromResult((IReadOnlyList<byte>) token);
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<byte>> GetMetaInfo(CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
List<byte> data = new List<byte>();
|
||||
data.AddRange(Encoding.ASCII.GetBytes("FABACCESS\0DESFIRE\01.0\0").Append((byte)0x00));
|
||||
return Task.FromResult((IReadOnlyList<byte>)data);
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<byte>> GetSpaceInfo(CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
List<byte> data = new List<byte>();
|
||||
data.AddRange(Encoding.ASCII.GetBytes("urn:fabaccess:lab:fabaccess_test").Append((byte)0x00));
|
||||
return Task.FromResult((IReadOnlyList<byte>)data);
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<IReadOnlyList<byte>>> GetTokenList(CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
List<byte> token = new List<byte>();
|
||||
token.AddRange(HexConverter.ConvertFromHexString("11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11".Replace(" ", "")));
|
||||
|
||||
IReadOnlyList<IReadOnlyList<byte>> list = new List<List<byte>>
|
||||
{
|
||||
token
|
||||
};
|
||||
return Task.FromResult(list);
|
||||
}
|
||||
|
||||
public Task Unbind(IReadOnlyList<byte> token, CancellationToken cancellationToken_ = default)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
116
Borepin/Borepin/Model/FabFireCard.cs
Normal file
116
Borepin/Borepin/Model/FabFireCard.cs
Normal file
@ -0,0 +1,116 @@
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using NFC.Cards.NXP_MIFARE_DESFire;
|
||||
using NFC.Cards.NXP_MIFARE_DESFire.Enums;
|
||||
using NFC.Helper;
|
||||
using NFC.Helper.Crypto;
|
||||
using NFC.Interfaces;
|
||||
using System;
|
||||
using System.Text;
|
||||
using ZXing.Aztec.Internal;
|
||||
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public class FabFireCard
|
||||
{
|
||||
#region Private Fields
|
||||
readonly INFCService _NFCService;
|
||||
readonly IErrorMessageService _ErrorMessageService;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public FabFireCard(INFCService nfcService, IErrorMessageService errorMessageService)
|
||||
{
|
||||
_NFCService = nfcService;
|
||||
_ErrorMessageService = errorMessageService;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>
|
||||
/// Format Card
|
||||
/// </summary>
|
||||
/// <param name="readerID"></param>
|
||||
/// <param name="cardConfig"></param>
|
||||
public void FormatCard(string readerID, CardConfig cardConfig)
|
||||
{
|
||||
CipherKey PICCKey = new CipherKey(cardConfig.PICCKey, CipherType.TDES, 0x00);
|
||||
|
||||
_NFCService.Connect(readerID);
|
||||
|
||||
NXP_MIFARE_DESFire card = new NXP_MIFARE_DESFire(_NFCService);
|
||||
card.SelectApplication(0x000000);
|
||||
card.AuthenticateISO_DES(0x00, PICCKey._Key);
|
||||
card.Format();
|
||||
|
||||
_NFCService.Disconnect();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create DESFire Card for V1.0
|
||||
/// </summary>
|
||||
/// <param name="readerID"></param>
|
||||
/// <param name="cardConfig"></param>
|
||||
/// <returns>Key #1 for authentication </returns>
|
||||
public byte[] CreateCard(string readerID, CardConfig cardConfig)
|
||||
{
|
||||
CipherKey PICCKey = new CipherKey(cardConfig.PICCKey, CipherType.TDES, 0x00);
|
||||
CipherKey MasterKey = new CipherKey(cardConfig.APPKey, CipherType.AES, 0x10);
|
||||
CipherKey AuthKey = new CipherKey(cardConfig.GenerateRandomKey(), CipherType.AES, 0x10);
|
||||
UInt32 AID = 0x464142;
|
||||
|
||||
CipherKey _Default_DESKey = new CipherKey(CipherType.TDES);
|
||||
CipherKey _Default_AESKey = new CipherKey(CipherType.AES);
|
||||
|
||||
_NFCService.Connect(readerID);
|
||||
NXP_MIFARE_DESFire card = new NXP_MIFARE_DESFire(_NFCService);
|
||||
|
||||
if (cardConfig.DoFormat)
|
||||
{
|
||||
card.AuthenticateISO_DES(0x00, _Default_DESKey._Key);
|
||||
}
|
||||
else
|
||||
{
|
||||
card.AuthenticateISO_DES(0x00, PICCKey._Key);
|
||||
}
|
||||
|
||||
byte keySetting1 = card.GenerateKeySetting1(ChangeApplicationKey.MASTERKEY, ChangeMasterKeySettings.WITHMASTERKEY, CreateDeleteFile.ONLYMASTERKEY, FileDirectoryAccess.NOKEY, ChangeMasterKey.CHANGEABLE);
|
||||
byte keySetting2 = card.GenerateKeySetting2(CryptoOperationsType.AES, FileIdentifies.NOTUSED, 0x02);
|
||||
card.CreateApplication(AID, keySetting1, keySetting2);
|
||||
|
||||
card.SelectApplication(AID);
|
||||
card.AuthenticateISO_AES(0x00, _Default_AESKey._Key);
|
||||
|
||||
card.ChangeKey_AES(0x00, MasterKey._Key, MasterKey._KeyVersion);
|
||||
|
||||
card.AuthenticateISO_AES(0x00, MasterKey._Key);
|
||||
card.ChangeOtherKey_AES(0x01, AuthKey._Key, _Default_AESKey._Key, AuthKey._KeyVersion);
|
||||
|
||||
UInt16 accessRights = card.GenerateFileAccessRights((byte)FileAccessRights.FREE, 0x00, 0x00, 0x00);
|
||||
|
||||
card.CreateFile_Standard(0x01, FileCommunication.PLAIN, accessRights, (uint)cardConfig.MetaInfo.Length);
|
||||
card.CreateFile_Standard(0x02, FileCommunication.PLAIN, accessRights, (uint)cardConfig.SpaceInfo.Length);
|
||||
card.CreateFile_Standard(0x03, FileCommunication.PLAIN, accessRights, (uint)47);// TODO (uint)cardConfig.CardToken.Length);
|
||||
|
||||
card.WriteData(0x01, 0x00, cardConfig.MetaInfo);
|
||||
card.WriteData(0x02, 0x00, cardConfig.SpaceInfo);
|
||||
card.WriteData(0x03, 0x00, _TODOFixDataFileSize(cardConfig.CardToken));
|
||||
|
||||
_NFCService.Disconnect();
|
||||
|
||||
return AuthKey._Key;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// TODO implement GetFileInfo in DESFire
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
private byte[] _TODOFixDataFileSize(byte[] data)
|
||||
{
|
||||
byte[] array = ByteOperation.GenerateEmptyArray(47);
|
||||
data.CopyTo(array, 0);
|
||||
return array;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
14
Borepin/Borepin/Model/KeyScan.cs
Normal file
14
Borepin/Borepin/Model/KeyScan.cs
Normal file
@ -0,0 +1,14 @@
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public class KeyScan
|
||||
{
|
||||
public KeyScan(CardConfig cardConfig, KeyTypes keyType)
|
||||
{
|
||||
CardConfig = cardConfig;
|
||||
KeyType = keyType;
|
||||
}
|
||||
|
||||
public CardConfig CardConfig;
|
||||
public KeyTypes KeyType;
|
||||
}
|
||||
}
|
9
Borepin/Borepin/Model/KeyTypes.cs
Normal file
9
Borepin/Borepin/Model/KeyTypes.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace Borepin.Model
|
||||
{
|
||||
public enum KeyTypes
|
||||
{
|
||||
NONE,
|
||||
PICC,
|
||||
APP
|
||||
};
|
||||
}
|
@ -21,6 +21,11 @@ namespace Borepin.Model
|
||||
#region Methods
|
||||
public async Task LoadData()
|
||||
{
|
||||
if(_Machine== null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//ID = _Machine.Id;
|
||||
//Space = new SpaceVisualize(_Machine.Space);
|
||||
Name = _Machine.Name;
|
||||
@ -75,6 +80,7 @@ namespace Borepin.Model
|
||||
CanManage = !((ManageInterface_Proxy)_Machine.Manage).IsNull;
|
||||
CanAdmin = !((AdminInterface_Proxy)_Machine.Admin).IsNull;
|
||||
CanNotUseByPermission = State == MachineState.free && !CanUse;
|
||||
IsLock = !((ProdInterface_Proxy)_Machine.Prodable).IsNull;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -197,6 +203,13 @@ namespace Borepin.Model
|
||||
get => _CanNotUseByPermission;
|
||||
set => SetProperty(ref _CanNotUseByPermission, value);
|
||||
}
|
||||
|
||||
private bool _IsLock;
|
||||
public bool IsLock
|
||||
{
|
||||
get => _IsLock;
|
||||
set => SetProperty(ref _IsLock, value);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,11 @@ namespace Borepin.Model
|
||||
#region LoadData
|
||||
public Task LoadData()
|
||||
{
|
||||
if(_User == null)
|
||||
{
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
//ID = _User.Id;
|
||||
Username = _User.Username;
|
||||
//Space = new SpaceVisualize(_User.Space);
|
||||
|
475
Borepin/Borepin/MultilingualResources/Borepin.de-DE.xlf
Normal file
475
Borepin/Borepin/MultilingualResources/Borepin.de-DE.xlf
Normal file
@ -0,0 +1,475 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 xliff-core-1.2-transitional.xsd">
|
||||
<file datatype="xml" source-language="en" target-language="de-DE" original="BOREPIN/RESOURCES/TEXT/TEXTRESOURCE.RESX" tool-id="MultilingualAppToolkit" product-name="n/a" product-version="n/a" build-num="n/a">
|
||||
<header>
|
||||
<tool tool-id="MultilingualAppToolkit" tool-name="Multilingual App Toolkit" tool-version="1.0.0.0" tool-company="Microsoft" />
|
||||
</header>
|
||||
<body>
|
||||
<group id="BOREPIN/RESOURCES/TEXT/TEXTRESOURCE.RESX" datatype="resx">
|
||||
<trans-unit id="AddServerProcess_AuthPlainPage_Login" translate="yes" xml:space="preserve">
|
||||
<source>Login</source>
|
||||
<target state="new">Login</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_ChooseAuthTypePage_LoginCard" translate="yes" xml:space="preserve">
|
||||
<source>Login with Card</source>
|
||||
<target state="new">Login with Card</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_ChooseAuthTypePage_LoginPassword" translate="yes" xml:space="preserve">
|
||||
<source>Login with Password</source>
|
||||
<target state="new">Login with Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_ChooseAuthTypePage_Register" translate="yes" xml:space="preserve">
|
||||
<source>Register</source>
|
||||
<target state="new">Register</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_ChooseAuthTypePage_SignIn" translate="yes" xml:space="preserve">
|
||||
<source>Sign In:</source>
|
||||
<target state="new">Sign In:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_ChooseAuthTypePage_SignUp" translate="yes" xml:space="preserve">
|
||||
<source>Sign Up:</source>
|
||||
<target state="new">Sign Up:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_SelectServerPage_Connect" translate="yes" xml:space="preserve">
|
||||
<source>Connect to Server</source>
|
||||
<target state="new">Connect to Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_SelectServerPage_Info" translate="yes" xml:space="preserve">
|
||||
<source>FabAccess is a decentralized machine management system, which means that it is designed to allow each Space to have its own dedicated server for managing its machines. If you want to connect to the FabAccess server for a specific Space, you will need to obtain the host address from that particular Space.
|
||||
|
||||
In addition to being able to connect to individual servers, FabAccess also allows you to add multiple servers to your account. This feature is especially useful for makers and innovators who have access to machines at multiple Spaces.</source>
|
||||
<target state="new">FabAccess is a decentralized machine management system, which means that it is designed to allow each Space to have its own dedicated server for managing its machines. If you want to connect to the FabAccess server for a specific Space, you will need to obtain the host address from that particular Space.
|
||||
|
||||
In addition to being able to connect to individual servers, FabAccess also allows you to add multiple servers to your account. This feature is especially useful for makers and innovators who have access to machines at multiple Spaces.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_SelectServerPage_Placeholder" translate="yes" xml:space="preserve">
|
||||
<source>test.fab-access.org</source>
|
||||
<target state="new">test.fab-access.org</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddServerProcess_SelectServerPage_TryConnection" translate="yes" xml:space="preserve">
|
||||
<source>Trying to connect to the server</source>
|
||||
<target state="new">Trying to connect to the server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="AddUserPage_AddUser" translate="yes" xml:space="preserve">
|
||||
<source>Add User</source>
|
||||
<target state="new">Add User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT" translate="yes" xml:space="preserve">
|
||||
<source>Alert</source>
|
||||
<target state="new">Alert</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_AddressInvalid" translate="yes" xml:space="preserve">
|
||||
<source>Server address is invaild.</source>
|
||||
<target state="new">Server address is invaild.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_AddUserFailed" translate="yes" xml:space="preserve">
|
||||
<source>Add User failed.</source>
|
||||
<target state="new">Add User failed.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_AuthFailed" translate="yes" xml:space="preserve">
|
||||
<source>Authentication failed.</source>
|
||||
<target state="new">Authentication failed.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_AuthServer" translate="yes" xml:space="preserve">
|
||||
<source>Unable to authenticate to server.</source>
|
||||
<target state="new">Unable to authenticate to server.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_BadMechanism" translate="yes" xml:space="preserve">
|
||||
<source>SASL Mechanism is not supported.</source>
|
||||
<target state="new">SASL Mechanism is not supported.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_ConnectionFailed" translate="yes" xml:space="preserve">
|
||||
<source>Connection failed.</source>
|
||||
<target state="new">Connection failed.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Title</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_ConnectionTimeout" translate="yes" xml:space="preserve">
|
||||
<source>Connection time exceeded.</source>
|
||||
<target state="new">Connection time exceeded.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_CredentialsInvalid" translate="yes" xml:space="preserve">
|
||||
<source>Credentials are invalid.</source>
|
||||
<target state="new">Credentials are invalid.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_DuplicateConnection" translate="yes" xml:space="preserve">
|
||||
<source>Connection already exist. Please delete old Connection before adding the new Connection.</source>
|
||||
<target state="new">Connection already exist. Please delete old Connection before adding the new Connection.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_ID" translate="yes" xml:space="preserve">
|
||||
<source>ID is invalid.</source>
|
||||
<target state="new">ID is invalid.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_PasswordInvalid" translate="yes" xml:space="preserve">
|
||||
<source>Password is invalid.</source>
|
||||
<target state="new">Password is invalid.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_QRInvalid" translate="yes" xml:space="preserve">
|
||||
<source>QR Code is invalid</source>
|
||||
<target state="new">QR Code is invalid</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_SASLAuth" translate="yes" xml:space="preserve">
|
||||
<source>SASL Authentication failed</source>
|
||||
<target state="new">SASL Authentication failed</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_TLSInvalid" translate="yes" xml:space="preserve">
|
||||
<source>TLS certificate is invalid.</source>
|
||||
<target state="new">TLS certificate is invalid.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_UnableServer" translate="yes" xml:space="preserve">
|
||||
<source>Unable to connect to server.</source>
|
||||
<target state="new">Unable to connect to server.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_UnexpectedError" translate="yes" xml:space="preserve">
|
||||
<source>Unexpected Error.</source>
|
||||
<target state="new">Unexpected Error.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_UserExist" translate="yes" xml:space="preserve">
|
||||
<source>User already exist.</source>
|
||||
<target state="new">User already exist.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="ALERT_UsernameInvalid" translate="yes" xml:space="preserve">
|
||||
<source>Username is invalid.</source>
|
||||
<target state="new">Username is invalid.</target>
|
||||
<note from="MultilingualBuild" annotates="source" priority="2">Message Content</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Bionade" translate="yes" xml:space="preserve">
|
||||
<source>It's Bionade!</source>
|
||||
<target state="new">It's Bionade!</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="BUILD" translate="yes" xml:space="preserve">
|
||||
<source>Build</source>
|
||||
<target state="new">Build</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="CANCEL" translate="yes" xml:space="preserve">
|
||||
<source>Cancel</source>
|
||||
<target state="new">Cancel</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="CONFIRM" translate="yes" xml:space="preserve">
|
||||
<source>Confirm</source>
|
||||
<target state="new">Confirm</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ConnectionStatus_Connecting" translate="yes" xml:space="preserve">
|
||||
<source>Connecting to Server</source>
|
||||
<target state="new">Connecting to Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ConnectionStatus_NoConnection" translate="yes" xml:space="preserve">
|
||||
<source>No Connection to Server</source>
|
||||
<target state="new">No Connection to Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ConnectionStatus_NotConnected" translate="yes" xml:space="preserve">
|
||||
<source>Please select a Server.</source>
|
||||
<target state="new">Please select a Server.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DELETE" translate="yes" xml:space="preserve">
|
||||
<source>Delete</source>
|
||||
<target state="new">Delete</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DIALOG_DeleteServer" translate="yes" xml:space="preserve">
|
||||
<source>Delete Server</source>
|
||||
<target state="new">Delete Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DIALOG_DeleteServerConfirm" translate="yes" xml:space="preserve">
|
||||
<source>Do you really want to delete this Server?</source>
|
||||
<target state="new">Do you really want to delete this Server?</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DIALOG_DeleteUser" translate="yes" xml:space="preserve">
|
||||
<source>Delete User</source>
|
||||
<target state="new">Delete User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="DIALOG_DeleteUserConfirm" translate="yes" xml:space="preserve">
|
||||
<source>Do you really want to delete this User?</source>
|
||||
<target state="new">Do you really want to delete this User?</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="FABACCESS" translate="yes" xml:space="preserve">
|
||||
<source>FabAccess</source>
|
||||
<target state="new">FabAccess</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="HOST" translate="yes" xml:space="preserve">
|
||||
<source>Host</source>
|
||||
<target state="new">Host</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="InUseByMe" translate="yes" xml:space="preserve">
|
||||
<source>In Use By Me</source>
|
||||
<target state="new">In Use By Me</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MACHINE" translate="yes" xml:space="preserve">
|
||||
<source>Machine</source>
|
||||
<target state="new">Machine</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_CanNotUseByPermission" translate="yes" xml:space="preserve">
|
||||
<source>You are not currently authorized to use this machine.
|
||||
Please speak with the staff at the Space to receive the necessary training and authorization.</source>
|
||||
<target state="new">You are not currently authorized to use this machine.
|
||||
Please speak with the staff at the Space to receive the necessary training and authorization.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_CurrentUser" translate="yes" xml:space="preserve">
|
||||
<source>Current User:</source>
|
||||
<target state="new">Current User:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_ForceBlock" translate="yes" xml:space="preserve">
|
||||
<source>Block Machine</source>
|
||||
<target state="new">Block Machine</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_ForceDisable" translate="yes" xml:space="preserve">
|
||||
<source>Disable Machine</source>
|
||||
<target state="new">Disable Machine</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_ForceFree" translate="yes" xml:space="preserve">
|
||||
<source>Free Machine</source>
|
||||
<target state="new">Free Machine</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_GiveBack" translate="yes" xml:space="preserve">
|
||||
<source>GiveBack</source>
|
||||
<target state="new">GiveBack</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_Identify" translate="yes" xml:space="preserve">
|
||||
<source>Identify</source>
|
||||
<target state="new">Identify</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_LastUser" translate="yes" xml:space="preserve">
|
||||
<source>Last User:</source>
|
||||
<target state="new">Last User:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_ManageMachine" translate="yes" xml:space="preserve">
|
||||
<source>Manage Machine:</source>
|
||||
<target state="new">Manage Machine:</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_OpenWiki" translate="yes" xml:space="preserve">
|
||||
<source>Open Wiki</source>
|
||||
<target state="new">Open Wiki</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_Unlock" translate="yes" xml:space="preserve">
|
||||
<source>Unlock</source>
|
||||
<target state="new">Unlock</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MachinePage_Use" translate="yes" xml:space="preserve">
|
||||
<source>Use</source>
|
||||
<target state="new">Use</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Build" translate="yes" xml:space="preserve">
|
||||
<source>Build</source>
|
||||
<target state="new">Build</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Machines" translate="yes" xml:space="preserve">
|
||||
<source>Machines</source>
|
||||
<target state="new">Machines</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Profile" translate="yes" xml:space="preserve">
|
||||
<source>My Profile</source>
|
||||
<target state="new">My Profile</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Servers" translate="yes" xml:space="preserve">
|
||||
<source>Servers</source>
|
||||
<target state="new">Servers</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Users" translate="yes" xml:space="preserve">
|
||||
<source>Users</source>
|
||||
<target state="new">Users</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="MainPage_Version" translate="yes" xml:space="preserve">
|
||||
<source>Version</source>
|
||||
<target state="new">Version</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="OK" translate="yes" xml:space="preserve">
|
||||
<source>Ok</source>
|
||||
<target state="new">Ok</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="OR" translate="yes" xml:space="preserve">
|
||||
<source>or</source>
|
||||
<target state="new">or</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="PASSWORD" translate="yes" xml:space="preserve">
|
||||
<source>Password</source>
|
||||
<target state="new">Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ProfilePage_ChangePassword" translate="yes" xml:space="preserve">
|
||||
<source>Change Password</source>
|
||||
<target state="new">Change Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ProfilePage_NewPassword" translate="yes" xml:space="preserve">
|
||||
<source>New Password</source>
|
||||
<target state="new">New Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ProfilePage_OldPassword" translate="yes" xml:space="preserve">
|
||||
<source>Old Password</source>
|
||||
<target state="new">Old Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ProfilePage_UpdatePassword" translate="yes" xml:space="preserve">
|
||||
<source>Update Password</source>
|
||||
<target state="new">Update Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="SCANQR" translate="yes" xml:space="preserve">
|
||||
<source>Scan QR-Code</source>
|
||||
<target state="new">Scan QR-Code</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerListPage_ActiveConnection" translate="yes" xml:space="preserve">
|
||||
<source>Active Connection</source>
|
||||
<target state="new">Active Connection</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerListPage_ConnectToNewServer" translate="yes" xml:space="preserve">
|
||||
<source>Connect to new Server</source>
|
||||
<target state="new">Connect to new Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerListPage_LastConnection" translate="yes" xml:space="preserve">
|
||||
<source>Last Connections</source>
|
||||
<target state="new">Last Connections</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPageModel_ConnectionFailed" translate="yes" xml:space="preserve">
|
||||
<source>Connection failed</source>
|
||||
<target state="new">Connection failed</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPage_Connect" translate="yes" xml:space="preserve">
|
||||
<source>Connect</source>
|
||||
<target state="new">Connect</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPage_DefaultText" translate="yes" xml:space="preserve">
|
||||
<source>You can set a server as the default server and then the app will automatically connect to that server upon startup.</source>
|
||||
<target state="new">You can set a server as the default server and then the app will automatically connect to that server upon startup.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPage_Disconnect" translate="yes" xml:space="preserve">
|
||||
<source>Disconnect</source>
|
||||
<target state="new">Disconnect</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPage_IsDefault" translate="yes" xml:space="preserve">
|
||||
<source>This connection has been set as the default and FabAccess will automatically connect to this server upon startup.</source>
|
||||
<target state="new">This connection has been set as the default and FabAccess will automatically connect to this server upon startup.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="ServerPage_SetDefault" translate="yes" xml:space="preserve">
|
||||
<source>Set as Default Connection</source>
|
||||
<target state="new">Set as Default Connection</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="SetUpProcess_ScanPage_Button" translate="yes" xml:space="preserve">
|
||||
<source>Login to your Space</source>
|
||||
<target state="new">Login to your Space</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="SetUpProcess_WelcomePage_Button" translate="yes" xml:space="preserve">
|
||||
<source>Begin working</source>
|
||||
<target state="new">Begin working</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="SetUpProcess_WelcomePage_Text" translate="yes" xml:space="preserve">
|
||||
<source>FabAccess is a machine management system designed for makerspaces, fablab and other collaborative workspaces.
|
||||
|
||||
With FabAccess, you can access and schedule machines, manage users and receive real-time updates on machine status and usage. The platform provides a decentralized solution for managing and connecting to machines across different Spaces, making it easier for users to collaborate and innovate together.</source>
|
||||
<target state="new">FabAccess is a machine management system designed for makerspaces, fablab and other collaborative workspaces.
|
||||
|
||||
With FabAccess, you can access and schedule machines, manage users and receive real-time updates on machine status and usage. The platform provides a decentralized solution for managing and connecting to machines across different Spaces, making it easier for users to collaborate and innovate together.</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="SetUpProcess_WelcomePage_Title" translate="yes" xml:space="preserve">
|
||||
<source>Welcome to FabAccess</source>
|
||||
<target state="new">Welcome to FabAccess</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="StartPage_Connecting" translate="yes" xml:space="preserve">
|
||||
<source>Connecting to Server</source>
|
||||
<target state="new">Connecting to Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="StartPage_Starting" translate="yes" xml:space="preserve">
|
||||
<source>Starting App</source>
|
||||
<target state="new">Starting App</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_AddUser" translate="yes" xml:space="preserve">
|
||||
<source>Add User</source>
|
||||
<target state="new">Add User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_ConnectToServer" translate="yes" xml:space="preserve">
|
||||
<source>Connect to Server</source>
|
||||
<target state="new">Connect to Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Machine" translate="yes" xml:space="preserve">
|
||||
<source>Machine</source>
|
||||
<target state="new">Machine</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Machines" translate="yes" xml:space="preserve">
|
||||
<source>Machines</source>
|
||||
<target state="new">Machines</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Profile" translate="yes" xml:space="preserve">
|
||||
<source>My Profile</source>
|
||||
<target state="new">My Profile</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Server" translate="yes" xml:space="preserve">
|
||||
<source>Server</source>
|
||||
<target state="new">Server</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Servers" translate="yes" xml:space="preserve">
|
||||
<source>Servers</source>
|
||||
<target state="new">Servers</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Settings" translate="yes" xml:space="preserve">
|
||||
<source>Settings</source>
|
||||
<target state="new">Settings</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_User" translate="yes" xml:space="preserve">
|
||||
<source>User</source>
|
||||
<target state="new">User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="TITLE_Users" translate="yes" xml:space="preserve">
|
||||
<source>Users</source>
|
||||
<target state="new">Users</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="Uncategorised" translate="yes" xml:space="preserve">
|
||||
<source>Uncategorised</source>
|
||||
<target state="new">Uncategorised</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserListPage_AddUser" translate="yes" xml:space="preserve">
|
||||
<source>Add new User</source>
|
||||
<target state="new">Add new User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserListPage_Search" translate="yes" xml:space="preserve">
|
||||
<source>Search User</source>
|
||||
<target state="new">Search User</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserListPage_SearchUser" translate="yes" xml:space="preserve">
|
||||
<source>Search Username ...</source>
|
||||
<target state="new">Search Username ...</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="USERNAME" translate="yes" xml:space="preserve">
|
||||
<source>Username</source>
|
||||
<target state="new">Username</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserPage_ChangePassword" translate="yes" xml:space="preserve">
|
||||
<source>Update Password</source>
|
||||
<target state="new">Update Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserPage_CreateCard" translate="yes" xml:space="preserve">
|
||||
<source>Create new FabFire Card</source>
|
||||
<target state="new">Create new FabFire Card</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserPage_NewPassword" translate="yes" xml:space="preserve">
|
||||
<source>New Password</source>
|
||||
<target state="new">New Password</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserPage_UnbindCard" translate="yes" xml:space="preserve">
|
||||
<source>Unbind FabFire Card</source>
|
||||
<target state="new">Unbind FabFire Card</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="UserPage_UpdatePassword" translate="yes" xml:space="preserve">
|
||||
<source>Force Password Update</source>
|
||||
<target state="new">Force Password Update</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="VERSION" translate="yes" xml:space="preserve">
|
||||
<source>Version</source>
|
||||
<target state="new">Version</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="YAY" translate="yes" xml:space="preserve">
|
||||
<source>YAY</source>
|
||||
<target state="new">YAY</target>
|
||||
</trans-unit>
|
||||
</group>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
@ -13,7 +13,8 @@
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_TryConnection}" IsVisible="{Binding TestConnection}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.USERNAME}" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
|
@ -13,7 +13,7 @@
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_ChooseAuthTypePage_SignIn}" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
|
@ -12,21 +12,24 @@
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
<StackLayout>
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_TryConnection}" IsVisible="{Binding TestConnection}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.HOST}" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Entry Text="{Binding Host}" Keyboard="Url" IsSpellCheckEnabled="false"/>
|
||||
<Entry Text="{Binding Host}" Placeholder="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_Placeholder}" PlaceholderColor="{StaticResource SecondColor}" Keyboard="Url" IsSpellCheckEnabled="false"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_Connect}" Command="{Binding ConnectToServerCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.SCANQR}" Command="{Binding ScanCodeCommand}" Style="{StaticResource Style_Button_Primary}">
|
||||
<Button.IsVisible>
|
||||
<OnPlatform x:TypeArguments="x:Boolean"
|
||||
iOS="true"
|
||||
Android="true"/>
|
||||
<OnPlatform x:TypeArguments="x:Boolean">
|
||||
<On Platform="iOS" Value="True" />
|
||||
<On Platform="Android" Value="True" />
|
||||
<On Platform="UWP" Value="False" />
|
||||
</OnPlatform>
|
||||
</Button.IsVisible>
|
||||
</Button>
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_Info}"></Label>
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_Info}" Margin="0, 20, 0, 0"></Label>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
|
@ -4,29 +4,30 @@
|
||||
x:Class="Borepin.Page.AddUserPage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
xmlns:views="clr-namespace:Borepin.View"
|
||||
Title="{x:Static resource_text:TextResource.TITLE_AddUser}">
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<StackLayout IsVisible="{Binding IsConnected}">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="{x:Static resource_text:TextResource.USERNAME}" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Entry Text="{Binding Username}" Keyboard="Url" IsSpellCheckEnabled="false"/>
|
||||
<Label Text="{x:Static resource_text:TextResource.PASSWORD}" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Entry Text="{Binding Password}" Keyboard="Url" IsSpellCheckEnabled="false"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.AddUserPage_AddUser}" Command="{Binding AddUserCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
64
Borepin/Borepin/Page/CreateCardPage.xaml
Normal file
64
Borepin/Borepin/Page/CreateCardPage.xaml
Normal file
@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
x:Class="Borepin.Page.CreateCardPage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
xmlns:views="clr-namespace:Borepin.View"
|
||||
Title="Create Card">
|
||||
<NavigationPage.TitleView>
|
||||
<Button Text="Refresh" HorizontalOptions="End" BackgroundColor="{StaticResource SecondColor}" TextColor="{StaticResource FirstColor}" Command="{Binding RefreshCommand}"/>
|
||||
</NavigationPage.TitleView>
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="NFC Reader" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Picker ItemsSource="{Binding ReaderIDs}" SelectedItem="{Binding ReaderID}"></Picker>
|
||||
|
||||
|
||||
<Label Text="PICC Key" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="4*" />
|
||||
<ColumnDefinition Width="1*" />
|
||||
<ColumnDefinition Width="1*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Entry Grid.Column="0" Text="{Binding PICCKey}" IsSpellCheckEnabled="false"/>
|
||||
<Button Grid.Column="2" Text="Scan QR-Code" Command="{Binding ScanPICCKeyCommand}" Style="{StaticResource Style_Button_Primary}" IsVisible="False"/>
|
||||
</Grid>
|
||||
|
||||
<Label Text="Application Key" Style="{StaticResource Style_Label_Property_Title}"></Label>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="4*" />
|
||||
<ColumnDefinition Width="1*" />
|
||||
<ColumnDefinition Width="1*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Entry Grid.Column="0" Text="{Binding APPKey}" IsSpellCheckEnabled="false"/>
|
||||
<Button Grid.Column="1" Text="Random" Command="{Binding RandomAPPKeyCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button Grid.Column="2" Text="Scan QR-Code" Command="{Binding ScanAPPKeyCommand}" Style="{StaticResource Style_Button_Primary}" IsVisible="False"/>
|
||||
</Grid>
|
||||
|
||||
<StackLayout Orientation="Horizontal">
|
||||
<CheckBox IsChecked="{Binding FormatCard}"/>
|
||||
<Label Text="Format Card" VerticalOptions="Center"/>
|
||||
</StackLayout>
|
||||
|
||||
<Button Text="Create Card" Command="{Binding CreateCardCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
@ -7,12 +7,12 @@ using System.Threading.Tasks;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Xaml;
|
||||
|
||||
namespace Borepin.Dialog
|
||||
namespace Borepin.Page
|
||||
{
|
||||
[XamlCompilation(XamlCompilationOptions.Compile)]
|
||||
public partial class ScanDialog : ContentView
|
||||
public partial class CreateCardPage : ContentPage
|
||||
{
|
||||
public ScanDialog()
|
||||
public CreateCardPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
@ -1,32 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
<ContentPage
|
||||
xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
xmlns:views="clr-namespace:Borepin.View"
|
||||
x:Class="Borepin.Page.MachineListPage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
Title="{x:Static resource_text:TextResource.TITLE_Machines}">
|
||||
Title="{x:Static resource_text:TextResource.TITLE_Machines}"
|
||||
>
|
||||
<NavigationPage.TitleView>
|
||||
<Button Text="Refresh" HorizontalOptions="End" BackgroundColor="{StaticResource SecondColor}" TextColor="{StaticResource FirstColor}" Command="{Binding RefreshCommand}"/>
|
||||
</NavigationPage.TitleView>
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
<converters:ListNotEmptyConverter x:Key="ListNotEmptyConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<StackLayout IsVisible="{Binding IsConnected}">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected"/>
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Button Text="{x:Static resource_text:TextResource.SCANQR}" Command="{Binding ScanCodeCommand}" Style="{StaticResource Style_Button_Primary}">
|
||||
<Button.IsVisible>
|
||||
<OnPlatform x:TypeArguments="x:Boolean"
|
||||
iOS="True"
|
||||
Android="True"/>
|
||||
<OnPlatform x:TypeArguments="x:Boolean">
|
||||
<On Platform="iOS" Value="True" />
|
||||
<On Platform="Android" Value="True" />
|
||||
<On Platform="UWP" Value="False" />
|
||||
</OnPlatform>
|
||||
</Button.IsVisible>
|
||||
</Button>
|
||||
<ListView ItemsSource="{Binding MachineListItemViewModel_List}" SelectionMode="None" SeparatorColor="Transparent" IsGroupingEnabled="True" GroupDisplayBinding="{Binding Category}">
|
||||
@ -48,10 +56,6 @@
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}" ></Label>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
||||
|
@ -4,31 +4,38 @@
|
||||
x:Class="Borepin.Page.MachinePage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
xmlns:views="clr-namespace:Borepin.View"
|
||||
Title="{x:Static resource_text:TextResource.TITLE_Machine}">
|
||||
<NavigationPage.TitleView>
|
||||
<Label Text="{Binding MachineItem.State, Converter={StaticResource MachineStateStringConverter}}" FontAttributes="Bold" HorizontalOptions="End" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" WidthRequest="150" Margin="7.5" VerticalOptions="FillAndExpand" FontSize="Small" BackgroundColor="{Binding MachineItem.State, Converter={StaticResource MachineStateColorConverter}}"/>
|
||||
</NavigationPage.TitleView>
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
<converters:MachineStateColorConverter x:Key="MachineStateColorConverter"/>
|
||||
<converters:MachineStateStringConverter x:Key="MachineStateStringConverter"/>
|
||||
<converters:IsNotNullBoolConverter x:Key="IsNotNullBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<NavigationPage.TitleView>
|
||||
<Label Text="{Binding MachineItem.State, Converter={StaticResource MachineStateStringConverter}}" FontAttributes="Bold" HorizontalOptions="End" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" WidthRequest="150" Margin="7.5" VerticalOptions="FillAndExpand" FontSize="Small" BackgroundColor="{Binding MachineItem.State, Converter={StaticResource MachineStateColorConverter}}">
|
||||
<Label.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</Label.IsVisible>
|
||||
</Label>
|
||||
</NavigationPage.TitleView>
|
||||
<ContentPage.Content>
|
||||
<ScrollView>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Grid IsVisible="{Binding IsConnected}">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<StackLayout Grid.Row="0">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="{Binding MachineItem.Name}" Style="{StaticResource LabelStyle_Title}"/>
|
||||
<Label Text="{Binding MachineItem.Description}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<StackLayout Orientation="Horizontal" IsVisible="{Binding MachineItem.CurrentUser, Converter={StaticResource IsNotNullBoolConverter}}">
|
||||
@ -36,26 +43,30 @@
|
||||
<Label Text="{Binding MachineItem.CurrentUser.Username}" Style="{StaticResource Style_Label_Property_Text}"/>
|
||||
</StackLayout>
|
||||
|
||||
<StackLayout>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_Use}" IsVisible="{Binding MachineItem.CanUse}" Command="{Binding UseMachineCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Label Text="{x:Static resource_text:TextResource.MachinePage_CanNotUseByPermission}" IsVisible="{Binding MachineItem.CanNotUseByPermission}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<Label Text="{x:Static resource_text:TextResource.MachinePage_CanNotUseByPermission}" IsVisible="{Binding MachineItem.CanNotUseByPermission}" Style="{StaticResource Style_Label_Text_Center}" TextColor="{StaticResource FourthColor}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_GiveBack}" IsVisible="{Binding MachineItem.CanInUse}" Command="{Binding GiveBackMachineCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
<StackLayout Grid.Row="1" VerticalOptions="End">
|
||||
<Button VerticalOptions="End" Text="{x:Static resource_text:TextResource.MachinePage_OpenWiki}" IsVisible="{Binding MachineItem.Wiki, Converter={StaticResource IsNotNullBoolConverter}}" Command="{Binding OpenWikiCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
|
||||
<StackLayout Margin="0,10,0,0" IsVisible="{Binding MachineItem.IsLock}">
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_Unlock}" Command="{Binding UnlockLockCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_Identify}" Command="{Binding IdentifyLockCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
<StackLayout Grid.Row="2" VerticalOptions="End" IsVisible="{Binding MachineItem.CanManage}">
|
||||
|
||||
<Button VerticalOptions="End" Text="{x:Static resource_text:TextResource.MachinePage_OpenWiki}" IsVisible="{Binding MachineItem.Wiki, Converter={StaticResource IsNotNullBoolConverter}}" Command="{Binding OpenWikiCommand}" Margin="0,10,0,0" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<StackLayout Grid.Row="2" VerticalOptions="End" IsVisible="{Binding MachineItem.CanManage}" Margin="0,50,0,0">
|
||||
<Label Text="{x:Static resource_text:TextResource.MachinePage_ManageMachine}" Style="{StaticResource Style_Label_Property_Title}"/>
|
||||
<StackLayout Margin="10, 0, 0, 20" Orientation="Horizontal" IsVisible="{Binding MachineItem.LastUser, Converter={StaticResource IsNotNullBoolConverter}}">
|
||||
<StackLayout Orientation="Horizontal" IsVisible="{Binding MachineItem.LastUser, Converter={StaticResource IsNotNullBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.MachinePage_LastUser}" Style="{StaticResource Style_Label_Property_Title}"/>
|
||||
<Label Text="{Binding MachineItem.LastUser.Username}" Style="{StaticResource Style_Label_Property_Text}" Margin="10, 0, 0, 0"/>
|
||||
<Label Text="{Binding MachineItem.LastUser.Username}" Style="{StaticResource Style_Label_Property_Text}"/>
|
||||
</StackLayout>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_ForceFree}" Command="{Binding ForceFreeMachineCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_ForceBlock}" Command="{Binding ForceBlockMachineCommand}" Style="{StaticResource Style_Button_Admin}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.MachinePage_ForceDisable}" Command="{Binding ForceDisableMachineCommand}" Style="{StaticResource Style_Button_Admin}"/>
|
||||
</StackLayout>
|
||||
</Grid>
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}" IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}"></Label>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ScrollView>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
@ -3,20 +3,24 @@
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
x:Class="Borepin.Page.ProfilePage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text" xmlns:views="clr-namespace:Borepin.View"
|
||||
Title="{x:Static resource_text:TextResource.TITLE_Profile}">
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<StackLayout IsVisible="{Binding IsConnected}">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="{Binding Username}" Style="{StaticResource LabelStyle_Title}"/>
|
||||
<StackLayout IsVisible="{Binding CanManage}">
|
||||
<Label Text="{x:Static resource_text:TextResource.ProfilePage_ChangePassword}" Style="{StaticResource Style_Label_Property_Title}"/>
|
||||
@ -25,10 +29,6 @@
|
||||
<Button Text="{x:Static resource_text:TextResource.ProfilePage_UpdatePassword}" Command="{Binding UpdatePasswordCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
@ -6,7 +6,14 @@
|
||||
x:Class="Borepin.Page.ScanPage">
|
||||
<ContentPage.Content>
|
||||
<StackLayout IsVisible="{Binding IsVisible}">
|
||||
<zxing:ZXingScannerView Result="{Binding ScanResult, Mode=TwoWay}" ScanResultCommand="{Binding ScannedCommand}" IsScanning="{Binding IsScanning}" WidthRequest="300" HeightRequest="500" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand" Options="{Binding ScanOptions}"/>
|
||||
<zxing:ZXingScannerView
|
||||
Result="{Binding ScanResult, Mode=TwoWay}"
|
||||
ScanResultCommand="{Binding ScannedCommand}"
|
||||
IsScanning="{Binding IsScanning}"
|
||||
Options="{Binding ScanOptions}"
|
||||
VerticalOptions="FillAndExpand"
|
||||
HorizontalOptions="FillAndExpand"
|
||||
Margin="10"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.CANCEL}" Command="{Binding CancelCommand}"/>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
|
@ -6,7 +6,14 @@
|
||||
x:Class="Borepin.Page.ScanURNPage">
|
||||
<ContentPage.Content>
|
||||
<StackLayout IsVisible="{Binding IsVisible}">
|
||||
<zxing:ZXingScannerView Result="{Binding ScanResult, Mode=TwoWay}" ScanResultCommand="{Binding ScannedCommand}" IsScanning="{Binding IsScanning}" WidthRequest="300" HeightRequest="500" VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand" Options="{Binding ScanOptions}"/>
|
||||
<zxing:ZXingScannerView
|
||||
Result="{Binding ScanResult, Mode=TwoWay}"
|
||||
ScanResultCommand="{Binding ScannedCommand}"
|
||||
IsScanning="{Binding IsScanning}"
|
||||
Options="{Binding ScanOptions}"
|
||||
VerticalOptions="FillAndExpand"
|
||||
HorizontalOptions="FillAndExpand"
|
||||
Margin="10"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.CANCEL}" Command="{Binding CancelCommand}"/>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}" VerticalOptions="FillAndExpand">
|
||||
<Label Text="{x:Static resource_text:TextResource.ServerListPage_ActiveConnection}" IsVisible="{Binding HasActiveConnection}"/>
|
||||
|
@ -13,7 +13,8 @@
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
<Label Text="{x:Static resource_text:TextResource.AddServerProcess_SelectServerPage_TryConnection}" IsVisible="{Binding TestConnection}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<Grid IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}" VerticalOptions="FillAndExpand">
|
||||
<Grid.RowDefinitions>
|
||||
@ -23,8 +24,11 @@
|
||||
<StackLayout Grid.Row="0">
|
||||
<Label Text="{Binding DisplayAddress}" Style="{StaticResource LabelStyle_Title}"/>
|
||||
<Label Text="{Binding Connection_Item.Username}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
|
||||
<Button IsVisible="{Binding InstanceIsDefaultConnection, Converter={StaticResource InvertBoolConverter}}" Text="{x:Static resource_text:TextResource.ServerPage_SetDefault}" Margin="0,10,0,0" Command="{Binding SetDefaultCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Label IsVisible="{Binding InstanceIsDefaultConnection}" Text="{x:Static resource_text:TextResource.ServerPage_IsDefault}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<Label IsVisible="{Binding InstanceIsDefaultConnection}" Text="{x:Static resource_text:TextResource.ServerPage_IsDefault}" Style="{StaticResource Style_Label_Text_Center}" TextColor="{StaticResource FourthColor}"/>
|
||||
<Label IsVisible="{Binding InstanceIsDefaultConnection,Converter={StaticResource InvertBoolConverter}}" Text="{x:Static resource_text:TextResource.ServerPage_DefaultText}" Style="{StaticResource Style_Label_Text_Center}" TextColor="{StaticResource FourthColor}"/>
|
||||
|
||||
<Button IsVisible="{Binding InstanceIsActiveConnection, Converter={StaticResource InvertBoolConverter}}" Text="{x:Static resource_text:TextResource.ServerPage_Connect}" Margin="0,10,0,0" Command="{Binding ConnectCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button IsVisible="{Binding InstanceIsActiveConnection}" Text="{x:Static resource_text:TextResource.ServerPage_Disconnect}" Margin="0,10,0,0" Command="{Binding DisconnectCommand}" Style="{StaticResource Style_Button_Admin}"/>
|
||||
</StackLayout>
|
||||
|
@ -10,9 +10,9 @@
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
<StackLayout IsVisible="{Binding IsConnecting}" VerticalOptions="CenterAndExpand">
|
||||
<StackLayout IsVisible="{Binding RunConnecting}" VerticalOptions="CenterAndExpand">
|
||||
<Label Text="{x:Static resource_text:TextResource.StartPage_Connecting}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<ActivityIndicator IsRunning="{Binding IsConnecting}"/>
|
||||
<ActivityIndicator IsRunning="{Binding RunConnecting}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
|
@ -4,26 +4,35 @@
|
||||
xmlns:views="clr-namespace:Borepin.View"
|
||||
x:Class="Borepin.Page.UserListPage"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text" xmlns:prism="http://prismlibrary.com"
|
||||
Title="{x:Static resource_text:TextResource.TITLE_Users}">
|
||||
<NavigationPage.TitleView>
|
||||
<Button Text="Refresh" HorizontalOptions="End" BackgroundColor="{StaticResource SecondColor}" TextColor="{StaticResource FirstColor}" Command="{Binding RefreshCommand}"/>
|
||||
</NavigationPage.TitleView>
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
<converters:ListNotEmptyConverter x:Key="ListNotEmptyConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<StackLayout IsVisible="{Binding IsConnected}">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" />
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Button Text="{x:Static resource_text:TextResource.UserListPage_AddUser}" Command="{Binding AddUserCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<ListView ItemsSource="{Binding UserListItemViewModel_List}" SelectionMode="None" SeparatorColor="Transparent">
|
||||
<SearchBar Text="{Binding SearchUsername}" SearchCommand="{Binding SearchUserCommand}" Placeholder="{x:Static resource_text:TextResource.UserListPage_Search}" PlaceholderColor="{StaticResource SecondColor}">
|
||||
<SearchBar.Behaviors>
|
||||
<prism:EventToCommandBehavior EventName="TextChanged" Command="{Binding SearchUserCommand}"/>
|
||||
</SearchBar.Behaviors>
|
||||
</SearchBar>
|
||||
<ListView ItemsSource="{Binding FilteredUserListItemViewModel_List}" SelectionMode="None" SeparatorColor="Transparent">
|
||||
<ListView.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<ViewCell>
|
||||
@ -33,10 +42,6 @@
|
||||
</ListView.ItemTemplate>
|
||||
</ListView>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
||||
|
@ -8,19 +8,23 @@
|
||||
Title="{x:Static resource_text:TextResource.TITLE_User}">
|
||||
<ContentPage.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
<converters:MachineStateColorConverter x:Key="MachineStateColorConverter"/>
|
||||
<converters:MachineStateStringConverter x:Key="MachineStateStringConverter"/>
|
||||
<converters:IsNotNullBoolConverter x:Key="IsNotNullBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentPage.Resources>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Padding="20">
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"></ActivityIndicator>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy, Converter={StaticResource InvertBoolConverter}}">
|
||||
<StackLayout IsVisible="{Binding IsConnected}">
|
||||
<views:ConnectionStateView/>
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected"/>
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="{Binding UserItem.Username}" Style="{StaticResource LabelStyle_Title}"/>
|
||||
<ListView ItemsSource="{Binding PermissionSelectViewModel_List}" SelectionMode="None" SeparatorColor="Transparent">
|
||||
<ListView.ItemTemplate>
|
||||
@ -36,11 +40,21 @@
|
||||
<Entry Placeholder="{x:Static resource_text:TextResource.UserPage_NewPassword}" Text="{Binding NewPassword}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.UserPage_UpdatePassword}" Command="{Binding UpdatePasswordCommand}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
</StackLayout>
|
||||
<Button Grid.Row="1" Text="{x:Static resource_text:TextResource.DELETE}" Command="{Binding DeleteCommand}" Style="{StaticResource Style_Button_Admin}" VerticalOptions="End"/>
|
||||
<StackLayout IsVisible="{Binding CanCreateCard}">
|
||||
<StackLayout >
|
||||
<StackLayout.IsVisible>
|
||||
<OnPlatform x:TypeArguments="x:Boolean">
|
||||
<On Platform="iOS" Value="False" />
|
||||
<On Platform="Android" Value="False" />
|
||||
<On Platform="UWP" Value="True" />
|
||||
</OnPlatform>
|
||||
</StackLayout.IsVisible>
|
||||
<Button Text="{x:Static resource_text:TextResource.UserPage_CreateCard}" Command="{Binding CreateCardCommand}" IsVisible="{Binding HasCardBinded, Converter={StaticResource InvertBoolConverter}}" Style="{StaticResource Style_Button_Primary}"/>
|
||||
<Button Text="{x:Static resource_text:TextResource.UserPage_UnbindCard}" Command="{Binding UnbindCardCommand}" IsVisible="{Binding HasCardBinded}" Style="{StaticResource Style_Button_Admin}"/>
|
||||
</StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsConnected, Converter={StaticResource InvertBoolConverter}}">
|
||||
<Label Text="{x:Static resource_text:TextResource.PLEASECONNECTTOSERVER}"/>
|
||||
</StackLayout>
|
||||
|
||||
<Button Text="{x:Static resource_text:TextResource.DELETE}" Command="{Binding DeleteCommand}" Style="{StaticResource Style_Button_Admin}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
|
@ -5,9 +5,11 @@ using System.Windows.Input;
|
||||
using Borepin.Base;
|
||||
using Borepin.Base.Exceptions;
|
||||
using Borepin.Service;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using Borepin.Service.Storage;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using Prism.Commands;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
@ -20,12 +22,14 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
#region Private Fields
|
||||
private ConnectionData _ConnectionData;
|
||||
private readonly ILoginStorageService _LoginStorageService;
|
||||
private readonly IErrorMessageService _ErrorMessageService;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public AuthPlainPageModel(INavigationService navigationService, IAPIService apiService, IPageDialogService pageDialogService, ILoginStorageService loginStorageService) : base(navigationService, pageDialogService, apiService)
|
||||
public AuthPlainPageModel(INavigationService navigationService, IAPIService apiService, IPageDialogService pageDialogService, ILoginStorageService loginStorageService, IErrorMessageService errorMessageService) : base(navigationService, pageDialogService, apiService)
|
||||
{
|
||||
_LoginStorageService = loginStorageService;
|
||||
_ErrorMessageService = errorMessageService;
|
||||
|
||||
AuthenticateCommand = new DelegateCommand(async () => await AuthenticateCommandExecute().ConfigureAwait(false));
|
||||
}
|
||||
@ -67,6 +71,13 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
get => _Password;
|
||||
set => SetProperty(ref _Password, value);
|
||||
}
|
||||
|
||||
private bool _TestConnection;
|
||||
public bool TestConnection
|
||||
{
|
||||
get => _TestConnection;
|
||||
set => SetProperty(ref _TestConnection, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
@ -79,11 +90,19 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
public async Task AuthenticateCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
TestConnection = true;
|
||||
if (Username == null || Username == String.Empty || Password == null || Password == String.Empty)
|
||||
{
|
||||
IsBusy = false;
|
||||
return;
|
||||
}
|
||||
|
||||
Username = Username.Trim();
|
||||
|
||||
_ConnectionData = new ConnectionData()
|
||||
{
|
||||
Host = _ConnectionData.Host,
|
||||
Mechanism = Mechanism.PLAIN,
|
||||
Mechanism = SASLMechanismEnum.PLAIN,
|
||||
Username = Username,
|
||||
Properties = new Dictionary<string, object>(StringComparer.Ordinal)
|
||||
{
|
||||
@ -92,49 +111,24 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
},
|
||||
};
|
||||
|
||||
if (_API.IsConnected)
|
||||
{
|
||||
if (_API.IsConnected)
|
||||
{
|
||||
await _API.Disconnect().ConfigureAwait(true);
|
||||
_API.UnbindAllEvents();
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (_API.IsConnecting || _API.IsConnected)
|
||||
{
|
||||
await _API.Disconnect().ConfigureAwait(true);
|
||||
_API.UnbindEventHandler();
|
||||
}
|
||||
await _API.Connect(_ConnectionData).ConfigureAwait(false);
|
||||
}
|
||||
catch (ConnectingFailedException)
|
||||
catch (Exception exception)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnableServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
_ErrorMessageService.DisplayConnectFailedMessage(exception);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
TestConnection = false;
|
||||
return;
|
||||
}
|
||||
catch (AuthenticationFailedException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_AuthServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
catch(Exception)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnexpectedError, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
await _LoginStorageService.Add(_ConnectionData).ConfigureAwait(false);
|
||||
await _LoginStorageService.UpdateTimestamp(_ConnectionData).ConfigureAwait(false);
|
||||
|
||||
@ -146,6 +140,9 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
Log.Fatal(result.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
|
||||
IsBusy = false;
|
||||
TestConnection = false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
}
|
||||
public async void AuthPlainCommandExecute()
|
||||
{
|
||||
_ConnectionData.Mechanism = Mechanism.PLAIN;
|
||||
_ConnectionData.Mechanism = SASLMechanismEnum.PLAIN;
|
||||
|
||||
INavigationResult result = await _NavigationService.NavigateAsync("AddServerProcess_AuthPlainPage").ConfigureAwait(false);
|
||||
if(result.Exception != null)
|
||||
|
@ -1,6 +1,6 @@
|
||||
using Borepin.Base;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using Prism.Commands;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
@ -16,14 +16,19 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
{
|
||||
#region Private Fields
|
||||
private ConnectionData _ConnectionData;
|
||||
private IErrorMessageService _ErrorMessageService;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public SelectServerPageModel(INavigationService navigationService, IPageDialogService pageDialogService) : base(navigationService, pageDialogService)
|
||||
public SelectServerPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IErrorMessageService errorMessageService) : base(navigationService, pageDialogService)
|
||||
{
|
||||
_ErrorMessageService = errorMessageService;
|
||||
|
||||
ConnectToServerCommand = new DelegateCommand(async () => await ConnectToServerExecute().ConfigureAwait(false));
|
||||
DetectLocalServerCommand = new DelegateCommand(DetectHostCommandExecute);
|
||||
ScanCodeCommand = new DelegateCommand(ScanCodeCommandExecute);
|
||||
|
||||
TestConnection = false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -33,7 +38,7 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
if(instance is ConnectionData)
|
||||
{
|
||||
_ConnectionData = instance as ConnectionData;
|
||||
Host = _ConnectionData.Host.ToString();
|
||||
Host = _ConnectionData.Host.Host + ":" + _ConnectionData.Host.Port;
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
@ -62,6 +67,13 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
get => _Host;
|
||||
set => SetProperty(ref _Host, value);
|
||||
}
|
||||
|
||||
private bool _TestConnection;
|
||||
public bool TestConnection
|
||||
{
|
||||
get => _TestConnection;
|
||||
set => SetProperty(ref _TestConnection, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
@ -82,6 +94,7 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
|
||||
try
|
||||
{
|
||||
TestConnection = true;
|
||||
string server_address = "";
|
||||
if(Regex.IsMatch(Host, "([a-zA-Z]{2,20}):\\/\\/", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture, TimeSpan.FromSeconds(1)))
|
||||
{
|
||||
@ -97,6 +110,7 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
{
|
||||
builder.Port = 59661;
|
||||
}
|
||||
builder.Scheme = "fabaccess";
|
||||
|
||||
_ConnectionData = new ConnectionData()
|
||||
{
|
||||
@ -109,6 +123,7 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_AddressInvalid, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
TestConnection = false;
|
||||
IsBusy = false;
|
||||
});
|
||||
|
||||
@ -118,17 +133,14 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
try
|
||||
{
|
||||
API api = new API();
|
||||
await api.TestConnection(_ConnectionData).ConfigureAwait(false);
|
||||
await api.TryToConnect(_ConnectionData).ConfigureAwait(false);
|
||||
}
|
||||
catch(ConnectingFailedException)
|
||||
catch(Exception exception)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnableServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
_ErrorMessageService.DisplayConnectFailedMessage(exception);
|
||||
|
||||
TestConnection = false;
|
||||
IsBusy = false;
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -140,6 +152,9 @@ namespace Borepin.PageModel.AddServerProcess
|
||||
Log.Fatal(result.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
|
||||
TestConnection = false;
|
||||
IsBusy = false;
|
||||
}
|
||||
|
||||
private ICommand _ScanCodeCommand;
|
||||
|
441
Borepin/Borepin/PageModel/CreateCardPageModel.cs
Normal file
441
Borepin/Borepin/PageModel/CreateCardPageModel.cs
Normal file
@ -0,0 +1,441 @@
|
||||
using Borepin.Base;
|
||||
using Prism.Commands;
|
||||
using Prism.Navigation;
|
||||
using System.Windows.Input;
|
||||
using FabAccessAPI.Schema;
|
||||
using Prism.Services;
|
||||
using Borepin.Service;
|
||||
using System.Threading.Tasks;
|
||||
using Borepin.Base.Exceptions;
|
||||
using NFC.Interfaces;
|
||||
using System.Collections.Generic;
|
||||
using Borepin.Model;
|
||||
using Xamarin.Forms;
|
||||
using System;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using System.Linq;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
public class CreateCardPageModel : ConnectionModelBase
|
||||
{
|
||||
#region Private Fields
|
||||
private CardConfig _CardConfig;
|
||||
private User _User;
|
||||
private INFCService _NFCService;
|
||||
private IErrorMessageService _ErrorMessageService;
|
||||
|
||||
private KeyTypes _ScanKeyType = KeyTypes.NONE;
|
||||
private KeyTypes _ScanedKeyType = KeyTypes.NONE;
|
||||
#endregion
|
||||
|
||||
#region Contructors
|
||||
public CreateCardPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IAPIService apiService, INFCService nfcService, IErrorMessageService errorMessageService) : base(navigationService, pageDialogService, apiService)
|
||||
{
|
||||
_NFCService = nfcService;
|
||||
_ErrorMessageService = errorMessageService;
|
||||
_CardConfig= new CardConfig();
|
||||
|
||||
CreateCardCommand = new DelegateCommand(CreateCardCommandExecute);
|
||||
|
||||
ScanPICCKeyCommand = new DelegateCommand(ScanPICCKeyCommandExecute);
|
||||
ScanAPPKeyCommand = new DelegateCommand(ScanAPPKeyCommandExecute);
|
||||
RandomAPPKeyCommand = new DelegateCommand(RandomAPPKeyCommandExecute);
|
||||
|
||||
RefreshCommand = new DelegateCommand(async () => await RefreshCommandExecute().ConfigureAwait(true));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Data
|
||||
public override Task LoadInstance(object instance)
|
||||
{
|
||||
if (instance is string)
|
||||
{
|
||||
_CardConfig.UserID = instance as string;
|
||||
}
|
||||
else if (instance is CardConfig)
|
||||
{
|
||||
_CardConfig = instance as CardConfig;
|
||||
}
|
||||
else if (instance is KeyScan)
|
||||
{
|
||||
KeyScan keyScan = instance as KeyScan;
|
||||
_CardConfig = keyScan.CardConfig;
|
||||
_ScanedKeyType = keyScan.KeyType;
|
||||
_ScanKeyType = KeyTypes.NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InstanceIncorrectException();
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override Task LoadFromParameters(INavigationParameters parameters)
|
||||
{
|
||||
if (parameters.ContainsKey("result") && string.Equals((string)parameters["result"], "scanned", StringComparison.Ordinal) && parameters.ContainsKey("value"))
|
||||
{
|
||||
switch(_ScanedKeyType)
|
||||
{
|
||||
case (KeyTypes.PICC):
|
||||
try
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.ConvertFromString(PICCKey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.GenerateEmptyKey();
|
||||
}
|
||||
_CardConfig.PICCKey = _CardConfig.ConvertFromString((string)parameters["value"]);
|
||||
PICCKey = _CardConfig.ConvertToString(_CardConfig.PICCKey);
|
||||
break;
|
||||
case (KeyTypes.APP):
|
||||
try
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.ConvertFromString((string)parameters["value"]);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.GenerateEmptyKey();
|
||||
}
|
||||
APPKey = _CardConfig.ConvertToString(_CardConfig.APPKey);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public override async Task LoadAPIData()
|
||||
{
|
||||
_User = (await _API.Session.UserSystem.Search.GetUserByName(_CardConfig.UserID).ConfigureAwait(false)).Just;
|
||||
|
||||
ReaderIDs = await Task.Run(() =>
|
||||
{
|
||||
return _NFCService.GetReaderIDs();
|
||||
}).ConfigureAwait(false);
|
||||
|
||||
// Delay to sync with XAML Picker Item Source
|
||||
await Task.Delay(100).ConfigureAwait(false);
|
||||
if (ReaderIDs.Count > 0)
|
||||
{
|
||||
ReaderID = ReaderIDs[0];
|
||||
}
|
||||
|
||||
PICCKey = _CardConfig.ConvertToString(_CardConfig.PICCKey);
|
||||
APPKey = _CardConfig.ConvertToString(_CardConfig.APPKey);
|
||||
FormatCard = _CardConfig.DoFormat;
|
||||
}
|
||||
|
||||
public override Task<object> CreateInstance()
|
||||
{
|
||||
try
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.ConvertFromString(PICCKey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.GenerateEmptyKey();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.ConvertFromString(APPKey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.GenerateEmptyKey();
|
||||
}
|
||||
|
||||
_CardConfig.DoFormat = FormatCard;
|
||||
|
||||
switch(_ScanKeyType)
|
||||
{
|
||||
case (KeyTypes.PICC):
|
||||
return Task.FromResult<object>(new KeyScan(_CardConfig, KeyTypes.PICC));
|
||||
case (KeyTypes.APP):
|
||||
return Task.FromResult<object>(new KeyScan(_CardConfig, KeyTypes.APP));
|
||||
case (KeyTypes.NONE):
|
||||
default:
|
||||
return Task.FromResult<object>(_CardConfig);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
private IList<string> _ReaderIDs;
|
||||
public IList<string> ReaderIDs
|
||||
{
|
||||
get => _ReaderIDs;
|
||||
set => SetProperty(ref _ReaderIDs, value);
|
||||
}
|
||||
|
||||
private string _ReaderID;
|
||||
public string ReaderID
|
||||
{
|
||||
get => _ReaderID;
|
||||
set => SetProperty(ref _ReaderID, value);
|
||||
}
|
||||
|
||||
private string _PICCKey;
|
||||
public string PICCKey
|
||||
{
|
||||
get => _PICCKey;
|
||||
set => SetProperty(ref _PICCKey, value);
|
||||
}
|
||||
|
||||
private string _APPKey;
|
||||
public string APPKey
|
||||
{
|
||||
get => _APPKey;
|
||||
set => SetProperty(ref _APPKey, value);
|
||||
}
|
||||
|
||||
private bool _FormatCard;
|
||||
public bool FormatCard
|
||||
{
|
||||
get => _FormatCard;
|
||||
set => SetProperty(ref _FormatCard, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
private ICommand _RefreshCommand;
|
||||
public ICommand RefreshCommand
|
||||
{
|
||||
get => _RefreshCommand;
|
||||
set => SetProperty(ref _RefreshCommand, value);
|
||||
}
|
||||
public async Task RefreshCommandExecute()
|
||||
{
|
||||
if (_API.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(true);
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _CreateCardCommand;
|
||||
|
||||
public ICommand CreateCardCommand
|
||||
{
|
||||
get => _CreateCardCommand;
|
||||
set => SetProperty(ref _CreateCardCommand, value);
|
||||
}
|
||||
|
||||
public async void CreateCardCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
|
||||
if(ReaderID == null)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync("NFC Error", "No Card Reader selected", Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.ConvertFromString(PICCKey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync("NFC Error", "PICC Key invalid", Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.ConvertFromString(APPKey);
|
||||
}
|
||||
catch
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync("NFC Error", "APP Key invalid", Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
_CardConfig.DoFormat = FormatCard;
|
||||
|
||||
_CardConfig.CardToken = (await _User.CardDESFireEV2.GenCardToken().ConfigureAwait(false)).ToArray();
|
||||
_CardConfig.SpaceInfo = (await _User.CardDESFireEV2.GetSpaceInfo().ConfigureAwait(false)).ToArray();
|
||||
_CardConfig.MetaInfo = (await _User.CardDESFireEV2.GetMetaInfo().ConfigureAwait(false)).ToArray();
|
||||
|
||||
FabFireCard fabFireCard = new FabFireCard(_NFCService, _ErrorMessageService);
|
||||
|
||||
try
|
||||
{
|
||||
if(FormatCard)
|
||||
{
|
||||
fabFireCard.FormatCard(ReaderID, _CardConfig);
|
||||
}
|
||||
}
|
||||
catch(Exception exception)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync("NFC Error", "Format failed", Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
|
||||
_NFCService.Disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
byte[] key = fabFireCard.CreateCard(ReaderID, _CardConfig);
|
||||
await _User.CardDESFireEV2.Bind(_CardConfig.CardToken, new List<byte>(key)).ConfigureAwait(false);
|
||||
}
|
||||
catch(Exception excpetion)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync("NFC Error", "Card Creation failed", Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
_NFCService.Disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
INavigationResult result = await _NavigationService.GoBackAsync().ConfigureAwait(false);
|
||||
});
|
||||
IsBusy = false;
|
||||
}
|
||||
|
||||
#region PICCKey
|
||||
private ICommand _ScanPICCKeyCommand;
|
||||
|
||||
public ICommand ScanPICCKeyCommand
|
||||
{
|
||||
get => _ScanPICCKeyCommand;
|
||||
set => SetProperty(ref _ScanPICCKeyCommand, value);
|
||||
}
|
||||
|
||||
public void ScanPICCKeyCommandExecute()
|
||||
{
|
||||
_ScanKeyType = KeyTypes.PICC;
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
INavigationResult result = await _NavigationService.NavigateAsync("ScanPage").ConfigureAwait(false);
|
||||
if (result.Exception != null)
|
||||
{
|
||||
Log.Fatal(result.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private ICommand _RandomPICCKeyCommand;
|
||||
|
||||
public ICommand RandomPICCKeyCommand
|
||||
{
|
||||
get => _RandomPICCKeyCommand;
|
||||
set => SetProperty(ref _RandomPICCKeyCommand, value);
|
||||
}
|
||||
|
||||
public void RandomPICCKeyCommandExecute()
|
||||
{
|
||||
_CardConfig.PICCKey = _CardConfig.GenerateRandomKey();
|
||||
PICCKey = _CardConfig.ConvertToString(_CardConfig.PICCKey);
|
||||
}
|
||||
|
||||
private ICommand _ExportPICCKeyCommand;
|
||||
|
||||
public ICommand ExportPICCKeyCommand
|
||||
{
|
||||
get => _ExportPICCKeyCommand;
|
||||
set => SetProperty(ref _ExportPICCKeyCommand, value);
|
||||
}
|
||||
|
||||
public async void ExportPICCKeyCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
|
||||
await Task.Delay(1000).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region APPKey
|
||||
private ICommand _ScanAPPKeyCommand;
|
||||
|
||||
public ICommand ScanAPPKeyCommand
|
||||
{
|
||||
get => _ScanAPPKeyCommand;
|
||||
set => SetProperty(ref _ScanAPPKeyCommand, value);
|
||||
}
|
||||
|
||||
public void ScanAPPKeyCommandExecute()
|
||||
{
|
||||
_ScanKeyType = KeyTypes.APP;
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
INavigationResult result = await _NavigationService.NavigateAsync("ScanPage").ConfigureAwait(false);
|
||||
if (result.Exception != null)
|
||||
{
|
||||
Log.Fatal(result.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private ICommand _RandomAPPKeyCommand;
|
||||
|
||||
public ICommand RandomAPPKeyCommand
|
||||
{
|
||||
get => _RandomAPPKeyCommand;
|
||||
set => SetProperty(ref _RandomAPPKeyCommand, value);
|
||||
}
|
||||
|
||||
public void RandomAPPKeyCommandExecute()
|
||||
{
|
||||
_CardConfig.APPKey = _CardConfig.GenerateRandomKey();
|
||||
APPKey = _CardConfig.ConvertToString(_CardConfig.APPKey);
|
||||
}
|
||||
|
||||
private ICommand _ExportAPPKeyCommand;
|
||||
|
||||
public ICommand ExportAPPKeyCommand
|
||||
{
|
||||
get => _ExportAPPKeyCommand;
|
||||
set => SetProperty(ref _ExportAPPKeyCommand, value);
|
||||
}
|
||||
|
||||
public async void ExportAPPKeyCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
|
||||
await Task.Delay(1000).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
}
|
||||
#endregion
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -45,7 +45,7 @@ namespace Borepin.PageModel
|
||||
};
|
||||
MachineViewModelListGroup viewmodel_group_uncategorised = new MachineViewModelListGroup()
|
||||
{
|
||||
Category = null,
|
||||
Category = String.Empty,
|
||||
};
|
||||
|
||||
foreach (Machine machine in machine_list)
|
||||
@ -67,7 +67,7 @@ namespace Borepin.PageModel
|
||||
MachineListItemViewModel new_viewmodel = new MachineListItemViewModel(_NavigationService, _PageDialogService);
|
||||
tasks.Add(new_viewmodel.LoadInstance(machine));
|
||||
|
||||
viewmodel_group_inusebyme.Add(new_viewmodel);
|
||||
viewmodel_group_uncategorised.Add(new_viewmodel);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -100,7 +100,7 @@ namespace Borepin.PageModel
|
||||
viewmodel_group.Sort_Machines();
|
||||
}
|
||||
|
||||
viewmodel_group_uncategorised.Category = Resources.Text.TextResource.Uncategorised;
|
||||
viewmodel_group_uncategorised.Category = String.Empty;
|
||||
List<MachineViewModelListGroup> viewmodel_group_list_sorted = new List<MachineViewModelListGroup>();
|
||||
if(viewmodel_group_inusebyme.Count != 0)
|
||||
{
|
||||
@ -125,13 +125,6 @@ namespace Borepin.PageModel
|
||||
get => _MachineListItemViewModel_List;
|
||||
set => SetProperty(ref _MachineListItemViewModel_List, value);
|
||||
}
|
||||
|
||||
private bool _IsRefreshing;
|
||||
public bool IsRefreshing
|
||||
{
|
||||
get => _IsRefreshing;
|
||||
set => SetProperty(ref _IsRefreshing, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
@ -144,11 +137,17 @@ namespace Borepin.PageModel
|
||||
public async Task RefreshCommandExecute()
|
||||
{
|
||||
if(_API.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(true);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
IsRefreshing = false;
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _ScanCodeCommand;
|
||||
|
@ -11,6 +11,7 @@ using Borepin.Base.Exceptions;
|
||||
using Capnp.Rpc;
|
||||
using System;
|
||||
using Borepin.Service.Browser;
|
||||
using System.Text;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
@ -33,6 +34,9 @@ namespace Borepin.PageModel
|
||||
ForceBlockMachineCommand = new DelegateCommand(ForceBlockMachineCommandExecute);
|
||||
ForceDisableMachineCommand = new DelegateCommand(ForceDisableMachineCommandExecute);
|
||||
OpenWikiCommand = new DelegateCommand(OpenWikiCommandExecute);
|
||||
|
||||
UnlockLockCommand = new DelegateCommand(UnlockLockCommandExecute);
|
||||
IdentifyLockCommand = new DelegateCommand(IdentifyLockCommandExecute);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -236,6 +240,52 @@ namespace Borepin.PageModel
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _UnlockLockCommand;
|
||||
public ICommand UnlockLockCommand
|
||||
{
|
||||
get => _UnlockLockCommand;
|
||||
set => SetProperty(ref _UnlockLockCommand, value);
|
||||
}
|
||||
|
||||
public async void UnlockLockCommandExecute()
|
||||
{
|
||||
if (_API.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
Machine.IProdInterface prodInterface = _Machine.Prodable;
|
||||
await prodInterface.ProdWithData(Encoding.ASCII.GetBytes("action: unlock")).ConfigureAwait(false);
|
||||
}
|
||||
catch (RpcException exception) when (string.Equals(exception.Message, "RPC connection is broken. Task would never return.", StringComparison.Ordinal))
|
||||
{
|
||||
Log.Debug("RPC Connection Loss");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _IdentifyLockCommand;
|
||||
public ICommand IdentifyLockCommand
|
||||
{
|
||||
get => _IdentifyLockCommand;
|
||||
set => SetProperty(ref _IdentifyLockCommand, value);
|
||||
}
|
||||
|
||||
public async void IdentifyLockCommandExecute()
|
||||
{
|
||||
if (_API.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
Machine.IProdInterface prodInterface = _Machine.Prodable;
|
||||
await prodInterface.ProdWithData(Encoding.ASCII.GetBytes("action: identify")).ConfigureAwait(false);
|
||||
}
|
||||
catch (RpcException exception) when (string.Equals(exception.Message, "RPC connection is broken. Task would never return.", StringComparison.Ordinal))
|
||||
{
|
||||
Log.Debug("RPC Connection Loss");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,12 @@
|
||||
using Prism.Commands;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Input;
|
||||
using Xamarin.Forms;
|
||||
using ZXing;
|
||||
using ZXing.Mobile;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
@ -40,6 +42,23 @@ namespace Borepin.PageModel
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
public MobileBarcodeScanningOptions ScanOptions
|
||||
{
|
||||
get
|
||||
{
|
||||
return new MobileBarcodeScanningOptions()
|
||||
{
|
||||
PossibleFormats = new List<BarcodeFormat>()
|
||||
{
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.EAN_13,
|
||||
},
|
||||
AutoRotate = true,
|
||||
DelayBetweenContinuousScans = 300,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private Result _ScanResult;
|
||||
public Result ScanResult
|
||||
{
|
||||
@ -73,7 +92,6 @@ namespace Borepin.PageModel
|
||||
public void ScannedCommandExecute()
|
||||
{
|
||||
IsScanning = false;
|
||||
IsVisible = false;
|
||||
|
||||
INavigationParameters parameters = new NavigationParameters()
|
||||
{
|
||||
@ -96,7 +114,6 @@ namespace Borepin.PageModel
|
||||
public async Task CancelCommandExecute()
|
||||
{
|
||||
IsScanning = false;
|
||||
IsVisible = false;
|
||||
|
||||
INavigationParameters parameters = new NavigationParameters()
|
||||
{
|
||||
|
@ -37,11 +37,11 @@ namespace Borepin.PageModel
|
||||
{
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.EAN_13,
|
||||
// TODO add more Barcode Formats if needed
|
||||
},
|
||||
AutoRotate = true,
|
||||
DelayBetweenContinuousScans = 300,
|
||||
};
|
||||
}
|
||||
//set => SetProperty(ref _ScanOptions, value);
|
||||
}
|
||||
|
||||
private Result _ScanResult;
|
||||
@ -109,7 +109,7 @@ namespace Borepin.PageModel
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT, Resources.Text.TextResource.Alert_QRInvalid, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT, Resources.Text.TextResource.ALERT_QRInvalid, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
IsScanning = true;
|
||||
});
|
||||
return;
|
||||
@ -146,7 +146,6 @@ namespace Borepin.PageModel
|
||||
public async Task CancelCommandExecute()
|
||||
{
|
||||
IsScanning = false;
|
||||
IsVisible = false;
|
||||
|
||||
await _NavigationService.GoBackAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ namespace Borepin.PageModel
|
||||
List<Task> tasks = new List<Task>();
|
||||
|
||||
IList<ConnectionData> list = await _LoginStorageService.GetList().ConfigureAwait(false);
|
||||
if (_API.IsConnected)
|
||||
if (_API.IsConnected || _API.IsConnecting)
|
||||
{
|
||||
ActiveConnection = new ServerListItemViewModel(_NavigationService, _PageDialogService);
|
||||
await ActiveConnection.LoadInstance(_API.ConnectionData).ConfigureAwait(false);
|
||||
|
@ -1,9 +1,11 @@
|
||||
using Borepin.Base;
|
||||
using Borepin.Base.Exceptions;
|
||||
using Borepin.Service;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using Borepin.Service.Storage;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using Prism.Commands;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
@ -21,14 +23,16 @@ namespace Borepin.PageModel
|
||||
#region Private Fields
|
||||
private readonly IDialogService _DialogService;
|
||||
private readonly ILoginStorageService _LoginStorageService;
|
||||
private readonly IErrorMessageService _ErrorMessageService;
|
||||
private bool IsDialog = false;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public ServerPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IAPIService apiService, IDialogService dialogService, ILoginStorageService loginStorageService) : base(navigationService, pageDialogService, apiService)
|
||||
public ServerPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IAPIService apiService, IDialogService dialogService, ILoginStorageService loginStorageService, IErrorMessageService errorMessageService) : base(navigationService, pageDialogService, apiService)
|
||||
{
|
||||
_DialogService = dialogService;
|
||||
_LoginStorageService = loginStorageService;
|
||||
_ErrorMessageService = errorMessageService;
|
||||
|
||||
ConnectCommand = new DelegateCommand(async () => await ConnectCommandExecute().ConfigureAwait(false));
|
||||
DisconnectCommand = new DelegateCommand(async () => await DisonnectCommandExecute().ConfigureAwait(false));
|
||||
@ -51,7 +55,7 @@ namespace Borepin.PageModel
|
||||
throw new InstanceIncorrectException();
|
||||
}
|
||||
|
||||
if(_API.ConnectionData != null && Connection_Item != null)
|
||||
if((_API.IsConnected || _API.IsConnecting) && Connection_Item != null)
|
||||
{
|
||||
InstanceIsActiveConnection = Connection_Item.Equals(_API.ConnectionData);
|
||||
}
|
||||
@ -108,6 +112,13 @@ namespace Borepin.PageModel
|
||||
get => _InstanceIsDefaultConnection;
|
||||
set => SetProperty(ref _InstanceIsDefaultConnection, value);
|
||||
}
|
||||
|
||||
private bool _TestConnection;
|
||||
public bool TestConnection
|
||||
{
|
||||
get => _TestConnection;
|
||||
set => SetProperty(ref _TestConnection, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Commands
|
||||
@ -120,35 +131,24 @@ namespace Borepin.PageModel
|
||||
public async Task ConnectCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
|
||||
if(_API.IsConnected)
|
||||
{
|
||||
await _API.Disconnect().ConfigureAwait(true);
|
||||
_API.UnbindAllEvents();
|
||||
}
|
||||
TestConnection = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (_API.IsConnecting || _API.IsConnected)
|
||||
{
|
||||
await _API.Disconnect().ConfigureAwait(true);
|
||||
_API.UnbindEventHandler();
|
||||
}
|
||||
|
||||
await _API.Connect(Connection_Item).ConfigureAwait(false);
|
||||
}
|
||||
catch(ConnectingFailedException)
|
||||
catch(Exception exception)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnableServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
_ErrorMessageService.DisplayConnectFailedMessage(exception);
|
||||
|
||||
TestConnection = false;
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
catch(AuthenticationFailedException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_AuthServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
|
||||
IsBusy = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@ -162,6 +162,9 @@ namespace Borepin.PageModel
|
||||
Log.Fatal(result.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
|
||||
TestConnection = false;
|
||||
IsBusy = false;
|
||||
}
|
||||
private ICommand _SetDefaultCommand;
|
||||
public ICommand SetDefaultCommand
|
||||
@ -184,7 +187,7 @@ namespace Borepin.PageModel
|
||||
}
|
||||
public async Task DisonnectCommandExecute()
|
||||
{
|
||||
_API.UnbindAllEvents();
|
||||
_API.UnbindEventHandler();
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
|
||||
await LoadInstance(Connection_Item).ConfigureAwait(false);
|
||||
@ -215,7 +218,7 @@ namespace Borepin.PageModel
|
||||
if(string.Equals(result.Parameters.GetValue<string>("result"), "confirm", StringComparison.Ordinal))
|
||||
{
|
||||
await _API.Disconnect().ConfigureAwait(false);
|
||||
_API.UnbindAllEvents();
|
||||
_API.UnbindEventHandler();
|
||||
await _LoginStorageService.Remove(result.Parameters.GetValue<ConnectionData>("instance")).ConfigureAwait(false);
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
|
@ -1,11 +1,17 @@
|
||||
using Borepin.Base;
|
||||
using Borepin.Service;
|
||||
using Borepin.Service.ErrorMessage;
|
||||
using Borepin.Service.Storage;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using Prism.AppModel;
|
||||
using Prism.Navigation;
|
||||
using Prism.Services;
|
||||
using Prism.Services.Dialogs;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Authentication;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
@ -14,21 +20,23 @@ namespace Borepin.PageModel
|
||||
{
|
||||
#region Private Fields
|
||||
private readonly ILoginStorageService _LoginStorageService;
|
||||
private readonly IErrorMessageService _ErrorMessageService;
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public StartPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IAPIService apiService, ILoginStorageService loginStorageService) : base(navigationService, pageDialogService, apiService)
|
||||
public StartPageModel(INavigationService navigationService, IPageDialogService pageDialogService, IAPIService apiService, ILoginStorageService loginStorageService, IErrorMessageService errorMessageService) : base(navigationService, pageDialogService, apiService)
|
||||
{
|
||||
_LoginStorageService = loginStorageService;
|
||||
_ErrorMessageService = errorMessageService;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Fields
|
||||
private bool _IsConnecting;
|
||||
public bool IsConnecting
|
||||
private bool _RunConnecting;
|
||||
public bool RunConnecting
|
||||
{
|
||||
get => _IsConnecting;
|
||||
set => SetProperty(ref _IsConnecting, value);
|
||||
get => _RunConnecting;
|
||||
set => SetProperty(ref _RunConnecting, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -52,7 +60,7 @@ namespace Borepin.PageModel
|
||||
else if(connectionData_Default != null)
|
||||
{
|
||||
IsBusy = false;
|
||||
IsConnecting = true;
|
||||
RunConnecting = true;
|
||||
try
|
||||
{
|
||||
await _API.Connect(connectionData_Default).ConfigureAwait(false);
|
||||
@ -65,7 +73,12 @@ namespace Borepin.PageModel
|
||||
}
|
||||
});
|
||||
}
|
||||
catch
|
||||
catch (Exception exception)
|
||||
{
|
||||
_ErrorMessageService.DisplayConnectFailedMessage(exception);
|
||||
}
|
||||
|
||||
if (_API.IsConnected == false)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
|
@ -12,6 +12,7 @@ using NaturalSort.Extension;
|
||||
using System.Linq;
|
||||
using Borepin.Service;
|
||||
using Xamarin.Forms;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
@ -22,6 +23,7 @@ namespace Borepin.PageModel
|
||||
{
|
||||
RefreshCommand = new DelegateCommand(async ()=> await RefreshCommandExecute().ConfigureAwait(true));
|
||||
AddUserCommand = new DelegateCommand(AddUserCommandExecute);
|
||||
SearchUserCommand = new DelegateCommand(SearchUserCommandExecute);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -41,9 +43,9 @@ namespace Borepin.PageModel
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
UserListItemViewModel_List = new List<UserListItemViewModel>(viewmodel_list.OrderBy(x => x.User.Username, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
|
||||
viewmodel_list.OrderBy(x => x.Instance.Username, StringComparison.OrdinalIgnoreCase.WithNaturalSort());
|
||||
UserListItemViewModel_List = viewmodel_list;
|
||||
FilteredUserListItemViewModel_List = new List<UserListItemViewModel>(viewmodel_list.OrderBy(x => x.User.Username, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -55,11 +57,18 @@ namespace Borepin.PageModel
|
||||
set => SetProperty(ref _UserListItemViewModel_List, value);
|
||||
}
|
||||
|
||||
private bool _IsRefreshing;
|
||||
public bool IsRefreshing
|
||||
private IList<UserListItemViewModel> _FilteredUserListItemViewModel_List;
|
||||
public IList<UserListItemViewModel> FilteredUserListItemViewModel_List
|
||||
{
|
||||
get => _IsRefreshing;
|
||||
set => SetProperty(ref _IsRefreshing, value);
|
||||
get => _FilteredUserListItemViewModel_List;
|
||||
set => SetProperty(ref _FilteredUserListItemViewModel_List, value);
|
||||
}
|
||||
|
||||
private string _SearchUsername;
|
||||
public string SearchUsername
|
||||
{
|
||||
get => _SearchUsername;
|
||||
set => SetProperty(ref _SearchUsername, value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -73,11 +82,16 @@ namespace Borepin.PageModel
|
||||
public async Task RefreshCommandExecute()
|
||||
{
|
||||
if(_API.IsConnected)
|
||||
{
|
||||
try
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(true);
|
||||
}
|
||||
|
||||
IsRefreshing = false;
|
||||
catch (Exception)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ICommand _AddUserCommand;
|
||||
@ -97,6 +111,18 @@ namespace Borepin.PageModel
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private ICommand _SerachUserCommand;
|
||||
public ICommand SearchUserCommand
|
||||
{
|
||||
get => _SerachUserCommand;
|
||||
set => SetProperty(ref _SerachUserCommand, value);
|
||||
}
|
||||
public void SearchUserCommandExecute()
|
||||
{
|
||||
List<UserListItemViewModel> users = new List<UserListItemViewModel>(UserListItemViewModel_List);
|
||||
FilteredUserListItemViewModel_List = users.FindAll(x => x.User.Username.ToLower(CultureInfo.InvariantCulture).Contains(SearchUsername.ToLower(CultureInfo.InvariantCulture)));
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ using NaturalSort.Extension;
|
||||
using System.Linq;
|
||||
using Prism.Services.Dialogs;
|
||||
using Xamarin.Forms;
|
||||
using ZXing;
|
||||
|
||||
namespace Borepin.PageModel
|
||||
{
|
||||
@ -34,6 +35,8 @@ namespace Borepin.PageModel
|
||||
_DialogService = dialogService;
|
||||
DeleteCommand = new DelegateCommand(DeleteCommandExecute);
|
||||
UpdatePasswordCommand = new DelegateCommand(UpdatePasswordCommandExecute);
|
||||
CreateCardCommand = new DelegateCommand(CreateCardCommandExecute);
|
||||
UnbindCardCommand = new DelegateCommand(UnbindCardCommandExecute);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -44,6 +47,10 @@ namespace Borepin.PageModel
|
||||
{
|
||||
_ID = instance as string;
|
||||
}
|
||||
else if (instance is CardConfig)
|
||||
{
|
||||
_ID = (instance as CardConfig).UserID;
|
||||
}
|
||||
else if(instance == null && _IsDialog)
|
||||
{
|
||||
|
||||
@ -64,6 +71,11 @@ namespace Borepin.PageModel
|
||||
}
|
||||
|
||||
_User = (await _API.Session.UserSystem.Search.GetUserByName(_ID).ConfigureAwait(false)).Just;
|
||||
if(_User == null )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
UserItem = new UserVisualize(_User);
|
||||
await UserItem.LoadData().ConfigureAwait(false);
|
||||
|
||||
@ -85,11 +97,17 @@ namespace Borepin.PageModel
|
||||
viewmodel_list.Add(new_viewmodel);
|
||||
}
|
||||
|
||||
viewmodel_list.OrderBy(x => x.RoleName, StringComparison.OrdinalIgnoreCase.WithNaturalSort());
|
||||
PermissionSelectViewModel_List = viewmodel_list;
|
||||
PermissionSelectViewModel_List = new List<PermissionSelectViewModel>(viewmodel_list.OrderBy(x => x.RoleName, StringComparison.OrdinalIgnoreCase.WithNaturalSort()));
|
||||
|
||||
CanAdmin = !((UserSystem.ManageInterface_Proxy)_API.Session.UserSystem.Manage).IsNull;
|
||||
CanManage = !((User.ManageInterface_Proxy)_User.Manage).IsNull;
|
||||
|
||||
CanCreateCard = !((User.CardDESFireInterface_Proxy)_User.CardDESFireEV2).IsNull;
|
||||
if(CanCreateCard)
|
||||
{
|
||||
IReadOnlyList<IReadOnlyList<byte>> list = await _User.CardDESFireEV2.GetTokenList().ConfigureAwait(false);
|
||||
HasCardBinded = list != null && list.Count > 0;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -122,6 +140,20 @@ namespace Borepin.PageModel
|
||||
set => SetProperty(ref _CanManage, value);
|
||||
}
|
||||
|
||||
private bool _CanCreateCard;
|
||||
public bool CanCreateCard
|
||||
{
|
||||
get => _CanCreateCard;
|
||||
set => SetProperty(ref _CanCreateCard, value);
|
||||
}
|
||||
|
||||
private bool _HasCardBinded;
|
||||
public bool HasCardBinded
|
||||
{
|
||||
get => _HasCardBinded;
|
||||
set => SetProperty(ref _HasCardBinded, value);
|
||||
}
|
||||
|
||||
private string _NewPassword;
|
||||
public string NewPassword
|
||||
{
|
||||
@ -209,6 +241,60 @@ namespace Borepin.PageModel
|
||||
}
|
||||
IsBusy = false;
|
||||
}
|
||||
|
||||
private ICommand _UnbindCardCommand;
|
||||
public ICommand UnbindCardCommand
|
||||
{
|
||||
get => _UnbindCardCommand;
|
||||
set => SetProperty(ref _UnbindCardCommand, value);
|
||||
}
|
||||
|
||||
public async void UnbindCardCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
IReadOnlyList<IReadOnlyList<byte>> list = await _User.CardDESFireEV2.GetTokenList().ConfigureAwait(false);
|
||||
|
||||
if(list.Count > 0)
|
||||
{
|
||||
await _User.CardDESFireEV2.Unbind(list[0]).ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
await LoadAPIData().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
IsBusy = false;
|
||||
}
|
||||
|
||||
private ICommand _CreateCardCommand;
|
||||
public ICommand CreateCardCommand
|
||||
{
|
||||
get => _CreateCardCommand;
|
||||
set => SetProperty(ref _CreateCardCommand, value);
|
||||
}
|
||||
|
||||
public void CreateCardCommandExecute()
|
||||
{
|
||||
IsBusy = true;
|
||||
NavigationParameters parameters = new NavigationParameters
|
||||
{
|
||||
{ "instance", _ID },
|
||||
};
|
||||
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
INavigationResult result_nav = await _NavigationService.NavigateAsync("CreateCardPage", parameters).ConfigureAwait(false);
|
||||
if (result_nav.Exception != null)
|
||||
{
|
||||
Log.Fatal(result_nav.Exception, "Navigating failed");
|
||||
}
|
||||
});
|
||||
IsBusy = false;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
405
Borepin/Borepin/Resources/Text/TextResource.Designer.cs
generated
405
Borepin/Borepin/Resources/Text/TextResource.Designer.cs
generated
@ -1,10 +1,10 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
// Dieser Code wurde von einem Tool generiert.
|
||||
// Laufzeitversion:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||
// der Code erneut generiert wird.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@ -13,13 +13,13 @@ namespace Borepin.Resources.Text {
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
|
||||
/// </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", "16.0.0.0")]
|
||||
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
|
||||
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
|
||||
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
|
||||
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class TextResource {
|
||||
@ -33,7 +33,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
@ -47,8 +47,8 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
|
||||
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
@ -61,7 +61,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Login ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_AuthPlainPage_Login {
|
||||
get {
|
||||
@ -70,7 +70,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login with Card.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Login with Card ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_ChooseAuthTypePage_LoginCard {
|
||||
get {
|
||||
@ -79,7 +79,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login with Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Login with Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_ChooseAuthTypePage_LoginPassword {
|
||||
get {
|
||||
@ -88,7 +88,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Register.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Register ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_ChooseAuthTypePage_Register {
|
||||
get {
|
||||
@ -97,7 +97,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Sign In:.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Sign In: ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_ChooseAuthTypePage_SignIn {
|
||||
get {
|
||||
@ -106,7 +106,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Sign Up:.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Sign Up: ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_ChooseAuthTypePage_SignUp {
|
||||
get {
|
||||
@ -115,7 +115,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connect to Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connect to Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_SelectServerPage_Connect {
|
||||
get {
|
||||
@ -124,9 +124,9 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to FabAccess is a decentralized machine management system. Each Space thus uses its own server.
|
||||
///Ask your Space for the address of your server.
|
||||
///You can also put down several servers and then connect to the desired server..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die FabAccess is a decentralized machine management system, which means that it is designed to allow each Space to have its own dedicated server for managing its machines. If you want to connect to the FabAccess server for a specific Space, you will need to obtain the host address from that particular Space.
|
||||
///
|
||||
///In addition to being able to connect to individual servers, FabAccess also allows you to add multiple servers to your account. This feature is especially useful for makers and innovators who have access [Rest der Zeichenfolge wurde abgeschnitten]"; ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_SelectServerPage_Info {
|
||||
get {
|
||||
@ -135,7 +135,25 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add User.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die test.fab-access.org ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_SelectServerPage_Placeholder {
|
||||
get {
|
||||
return ResourceManager.GetString("AddServerProcess_SelectServerPage_Placeholder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Trying to connect to the server ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddServerProcess_SelectServerPage_TryConnection {
|
||||
get {
|
||||
return ResourceManager.GetString("AddServerProcess_SelectServerPage_TryConnection", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Add User ähnelt.
|
||||
/// </summary>
|
||||
internal static string AddUserPage_AddUser {
|
||||
get {
|
||||
@ -144,7 +162,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Alert.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Alert ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT {
|
||||
get {
|
||||
@ -153,7 +171,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Server address is invaild..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Server address is invaild. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_AddressInvalid {
|
||||
get {
|
||||
@ -162,7 +180,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add User failed.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Add User failed. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_AddUserFailed {
|
||||
get {
|
||||
@ -171,7 +189,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Unable to authenticate to server..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Authentication failed. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_AuthFailed {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_AuthFailed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Unable to authenticate to server. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_AuthServer {
|
||||
get {
|
||||
@ -180,7 +207,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connection failed.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die SASL Mechanism is not supported. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_BadMechanism {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_BadMechanism", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connection failed. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_ConnectionFailed {
|
||||
get {
|
||||
@ -189,7 +225,25 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connection already exist. Please delete old Connection before adding the new Connection..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connection time exceeded. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_ConnectionTimeout {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_ConnectionTimeout", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Credentials are invalid. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_CredentialsInvalid {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_CredentialsInvalid", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connection already exist. Please delete old Connection before adding the new Connection. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_DuplicateConnection {
|
||||
get {
|
||||
@ -198,7 +252,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Password is invalid..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die ID is invalid. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_ID {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_ID", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Password is invalid. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_PasswordInvalid {
|
||||
get {
|
||||
@ -207,16 +270,34 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to QR Code is invalid.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die QR Code is invalid ähnelt.
|
||||
/// </summary>
|
||||
internal static string Alert_QRInvalid {
|
||||
internal static string ALERT_QRInvalid {
|
||||
get {
|
||||
return ResourceManager.GetString("Alert_QRInvalid", resourceCulture);
|
||||
return ResourceManager.GetString("ALERT_QRInvalid", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Unable to connect to server..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die SASL Authentication failed ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_SASLAuth {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_SASLAuth", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die TLS certificate is invalid. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_TLSInvalid {
|
||||
get {
|
||||
return ResourceManager.GetString("ALERT_TLSInvalid", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Unable to connect to server. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_UnableServer {
|
||||
get {
|
||||
@ -225,7 +306,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Unexpected Error..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Unexpected Error. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_UnexpectedError {
|
||||
get {
|
||||
@ -234,7 +315,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to User allready exist..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die User already exist. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_UserExist {
|
||||
get {
|
||||
@ -243,7 +324,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Username is invalid..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Username is invalid. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ALERT_UsernameInvalid {
|
||||
get {
|
||||
@ -252,7 +333,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to It's Bionade.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die It's Bionade! ähnelt.
|
||||
/// </summary>
|
||||
internal static string Bionade {
|
||||
get {
|
||||
@ -261,7 +342,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Build.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Build ähnelt.
|
||||
/// </summary>
|
||||
internal static string BUILD {
|
||||
get {
|
||||
@ -270,7 +351,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Cancel.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Cancel ähnelt.
|
||||
/// </summary>
|
||||
internal static string CANCEL {
|
||||
get {
|
||||
@ -279,7 +360,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Confirm.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Confirm ähnelt.
|
||||
/// </summary>
|
||||
internal static string CONFIRM {
|
||||
get {
|
||||
@ -288,7 +369,34 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Delete.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connecting to Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string ConnectionStatus_Connecting {
|
||||
get {
|
||||
return ResourceManager.GetString("ConnectionStatus_Connecting", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die No Connection to Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string ConnectionStatus_NoConnection {
|
||||
get {
|
||||
return ResourceManager.GetString("ConnectionStatus_NoConnection", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Please select a Server. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ConnectionStatus_NotConnected {
|
||||
get {
|
||||
return ResourceManager.GetString("ConnectionStatus_NotConnected", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Delete ähnelt.
|
||||
/// </summary>
|
||||
internal static string DELETE {
|
||||
get {
|
||||
@ -297,7 +405,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Delete Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Delete Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string DIALOG_DeleteServer {
|
||||
get {
|
||||
@ -306,7 +414,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to "Do you really want to delete this Server?".
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Do you really want to delete this Server? ähnelt.
|
||||
/// </summary>
|
||||
internal static string DIALOG_DeleteServerConfirm {
|
||||
get {
|
||||
@ -315,7 +423,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Delete User.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Delete User ähnelt.
|
||||
/// </summary>
|
||||
internal static string DIALOG_DeleteUser {
|
||||
get {
|
||||
@ -324,7 +432,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Do you really want to delete this User?.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Do you really want to delete this User? ähnelt.
|
||||
/// </summary>
|
||||
internal static string DIALOG_DeleteUserConfirm {
|
||||
get {
|
||||
@ -333,7 +441,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to FabAccess.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die FabAccess ähnelt.
|
||||
/// </summary>
|
||||
internal static string FABACCESS {
|
||||
get {
|
||||
@ -342,7 +450,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Host.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Host ähnelt.
|
||||
/// </summary>
|
||||
internal static string HOST {
|
||||
get {
|
||||
@ -351,7 +459,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to In Use By Me.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die In Use By Me ähnelt.
|
||||
/// </summary>
|
||||
internal static string InUseByMe {
|
||||
get {
|
||||
@ -360,8 +468,17 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to You do not have the authorization to use this machine.
|
||||
///Ask in your Space if you can be trained on the machine to be unlocked for the machine..
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Machine ähnelt.
|
||||
/// </summary>
|
||||
internal static string MACHINE {
|
||||
get {
|
||||
return ResourceManager.GetString("MACHINE", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die You are not currently authorized to use this machine.
|
||||
///Please speak with the staff at the Space to receive the necessary training and authorization. ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_CanNotUseByPermission {
|
||||
get {
|
||||
@ -370,7 +487,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Current User:.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Current User: ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_CurrentUser {
|
||||
get {
|
||||
@ -379,7 +496,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Block Machine.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Block Machine ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_ForceBlock {
|
||||
get {
|
||||
@ -388,7 +505,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Disable Machine.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Disable Machine ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_ForceDisable {
|
||||
get {
|
||||
@ -397,7 +514,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Free Machine.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Free Machine ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_ForceFree {
|
||||
get {
|
||||
@ -406,7 +523,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to GiveBack.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die GiveBack ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_GiveBack {
|
||||
get {
|
||||
@ -415,7 +532,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Last User:.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Identify ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_Identify {
|
||||
get {
|
||||
return ResourceManager.GetString("MachinePage_Identify", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Last User: ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_LastUser {
|
||||
get {
|
||||
@ -424,7 +550,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Manage Machine:.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Manage Machine: ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_ManageMachine {
|
||||
get {
|
||||
@ -433,7 +559,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Open Wiki.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Open Wiki ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_OpenWiki {
|
||||
get {
|
||||
@ -442,7 +568,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Use.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Unlock ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_Unlock {
|
||||
get {
|
||||
return ResourceManager.GetString("MachinePage_Unlock", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Use ähnelt.
|
||||
/// </summary>
|
||||
internal static string MachinePage_Use {
|
||||
get {
|
||||
@ -451,7 +586,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Build.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Build ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Build {
|
||||
get {
|
||||
@ -460,7 +595,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Machines.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Machines ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Machines {
|
||||
get {
|
||||
@ -469,7 +604,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to My Profile.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die My Profile ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Profile {
|
||||
get {
|
||||
@ -478,7 +613,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Servers.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Servers ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Servers {
|
||||
get {
|
||||
@ -487,7 +622,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Users.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Users ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Users {
|
||||
get {
|
||||
@ -496,7 +631,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Version.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Version ähnelt.
|
||||
/// </summary>
|
||||
internal static string MainPage_Version {
|
||||
get {
|
||||
@ -505,7 +640,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Ok.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Ok ähnelt.
|
||||
/// </summary>
|
||||
internal static string OK {
|
||||
get {
|
||||
@ -514,7 +649,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to or.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die or ähnelt.
|
||||
/// </summary>
|
||||
internal static string OR {
|
||||
get {
|
||||
@ -523,7 +658,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string PASSWORD {
|
||||
get {
|
||||
@ -532,16 +667,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Please connect to Server.
|
||||
/// </summary>
|
||||
internal static string PLEASECONNECTTOSERVER {
|
||||
get {
|
||||
return ResourceManager.GetString("PLEASECONNECTTOSERVER", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Change Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Change Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string ProfilePage_ChangePassword {
|
||||
get {
|
||||
@ -550,7 +676,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to New Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die New Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string ProfilePage_NewPassword {
|
||||
get {
|
||||
@ -559,7 +685,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Old Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Old Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string ProfilePage_OldPassword {
|
||||
get {
|
||||
@ -568,7 +694,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Update Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Update Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string ProfilePage_UpdatePassword {
|
||||
get {
|
||||
@ -577,7 +703,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Scan QR-Code.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Scan QR-Code ähnelt.
|
||||
/// </summary>
|
||||
internal static string SCANQR {
|
||||
get {
|
||||
@ -586,7 +712,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Active Connection.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Active Connection ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerListPage_ActiveConnection {
|
||||
get {
|
||||
@ -595,7 +721,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connect to new Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connect to new Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerListPage_ConnectToNewServer {
|
||||
get {
|
||||
@ -604,7 +730,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Last Connections.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Last Connections ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerListPage_LastConnection {
|
||||
get {
|
||||
@ -613,7 +739,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connect.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connect ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPage_Connect {
|
||||
get {
|
||||
@ -622,7 +748,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Disconnect.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die You can set a server as the default server and then the app will automatically connect to that server upon startup. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPage_DefaultText {
|
||||
get {
|
||||
return ResourceManager.GetString("ServerPage_DefaultText", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Disconnect ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPage_Disconnect {
|
||||
get {
|
||||
@ -631,7 +766,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Is Default Connection.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die This connection has been set as the default and FabAccess will automatically connect to this server upon startup. ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPage_IsDefault {
|
||||
get {
|
||||
@ -640,7 +775,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Set as Default Connection.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Set as Default Connection ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPage_SetDefault {
|
||||
get {
|
||||
@ -649,7 +784,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connection failed.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connection failed ähnelt.
|
||||
/// </summary>
|
||||
internal static string ServerPageModel_ConnectionFailed {
|
||||
get {
|
||||
@ -658,7 +793,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Login to your Space.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Login to your Space ähnelt.
|
||||
/// </summary>
|
||||
internal static string SetUpProcess_ScanPage_Button {
|
||||
get {
|
||||
@ -667,7 +802,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Begin working.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Begin working ähnelt.
|
||||
/// </summary>
|
||||
internal static string SetUpProcess_WelcomePage_Button {
|
||||
get {
|
||||
@ -676,7 +811,9 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Automate your Space with FabAccess.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die FabAccess is a machine management system designed for makerspaces, fablab and other collaborative workspaces.
|
||||
///
|
||||
///With FabAccess, you can access and schedule machines, manage users and receive real-time updates on machine status and usage. The platform provides a decentralized solution for managing and connecting to machines across different Spaces, making it easier for users to collaborate and innovate together. ähnelt.
|
||||
/// </summary>
|
||||
internal static string SetUpProcess_WelcomePage_Text {
|
||||
get {
|
||||
@ -685,7 +822,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Welcome.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Welcome to FabAccess ähnelt.
|
||||
/// </summary>
|
||||
internal static string SetUpProcess_WelcomePage_Title {
|
||||
get {
|
||||
@ -694,7 +831,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connecting to Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connecting to Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string StartPage_Connecting {
|
||||
get {
|
||||
@ -703,7 +840,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Starting App.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Starting App ähnelt.
|
||||
/// </summary>
|
||||
internal static string StartPage_Starting {
|
||||
get {
|
||||
@ -712,7 +849,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add User.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Add User ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_AddUser {
|
||||
get {
|
||||
@ -721,7 +858,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Connect to Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Connect to Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_ConnectToServer {
|
||||
get {
|
||||
@ -730,7 +867,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Machine.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Machine ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Machine {
|
||||
get {
|
||||
@ -739,7 +876,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Machines.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Machines ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Machines {
|
||||
get {
|
||||
@ -748,7 +885,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to My Profile.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die My Profile ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Profile {
|
||||
get {
|
||||
@ -757,7 +894,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Server.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Server ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Server {
|
||||
get {
|
||||
@ -766,7 +903,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Servers.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Servers ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Servers {
|
||||
get {
|
||||
@ -775,7 +912,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Settings.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Settings ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Settings {
|
||||
get {
|
||||
@ -784,7 +921,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to User.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die User ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_User {
|
||||
get {
|
||||
@ -793,7 +930,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Users.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Users ähnelt.
|
||||
/// </summary>
|
||||
internal static string TITLE_Users {
|
||||
get {
|
||||
@ -802,7 +939,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Uncategorised.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Uncategorised ähnelt.
|
||||
/// </summary>
|
||||
internal static string Uncategorised {
|
||||
get {
|
||||
@ -811,7 +948,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Add User.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Add new User ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserListPage_AddUser {
|
||||
get {
|
||||
@ -820,7 +957,25 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Username.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Search User ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserListPage_Search {
|
||||
get {
|
||||
return ResourceManager.GetString("UserListPage_Search", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Search Username ... ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserListPage_SearchUser {
|
||||
get {
|
||||
return ResourceManager.GetString("UserListPage_SearchUser", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Username ähnelt.
|
||||
/// </summary>
|
||||
internal static string USERNAME {
|
||||
get {
|
||||
@ -829,7 +984,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Update Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Update Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserPage_ChangePassword {
|
||||
get {
|
||||
@ -838,7 +993,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to New Password.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Create new FabFire Card ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserPage_CreateCard {
|
||||
get {
|
||||
return ResourceManager.GetString("UserPage_CreateCard", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die New Password ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserPage_NewPassword {
|
||||
get {
|
||||
@ -847,7 +1011,16 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Force Password Update.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Unbind FabFire Card ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserPage_UnbindCard {
|
||||
get {
|
||||
return ResourceManager.GetString("UserPage_UnbindCard", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Force Password Update ähnelt.
|
||||
/// </summary>
|
||||
internal static string UserPage_UpdatePassword {
|
||||
get {
|
||||
@ -856,7 +1029,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Version.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die Version ähnelt.
|
||||
/// </summary>
|
||||
internal static string VERSION {
|
||||
get {
|
||||
@ -865,7 +1038,7 @@ namespace Borepin.Resources.Text {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to YAY.
|
||||
/// Sucht eine lokalisierte Zeichenfolge, die YAY ähnelt.
|
||||
/// </summary>
|
||||
internal static string YAY {
|
||||
get {
|
||||
|
452
Borepin/Borepin/Resources/Text/TextResource.de.resx
Normal file
452
Borepin/Borepin/Resources/Text/TextResource.de.resx
Normal file
@ -0,0 +1,452 @@
|
||||
<?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="AddServerProcess_AuthPlainPage_Login" xml:space="preserve">
|
||||
<value>Login</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_LoginCard" xml:space="preserve">
|
||||
<value>Login mit Karte</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_LoginPassword" xml:space="preserve">
|
||||
<value>Login mit Passwort</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_Register" xml:space="preserve">
|
||||
<value>Registrieren</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_SignIn" xml:space="preserve">
|
||||
<value>Eintragen:</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_SignUp" xml:space="preserve">
|
||||
<value>Anmelden:</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Connect" xml:space="preserve">
|
||||
<value>Zu Server verbinden</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Info" xml:space="preserve">
|
||||
<value>FabAccess ist ein dezentralisiertes Maschinenverwaltungssystem, d.h. es ist so konzipiert, dass jeder Space seinen eigenen dedizierten Server für die Verwaltung seiner Maschinen hat. Wenn Sie sich mit dem FabAccess-Server eines bestimmten Spaces verbinden wollen, müssen Sie die Host-Adresse von diesem Space erhalten.
|
||||
|
||||
Neben der Möglichkeit, sich mit einzelnen Servern zu verbinden, können Sie mit FabAccess auch mehrere Server zu Ihrem Konto hinzufügen. Diese Funktion ist besonders nützlich für Macher und Innovatoren, die Zugang zu Maschinen in mehreren Spaces haben.</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Placeholder" xml:space="preserve">
|
||||
<value>test.fab-access.org</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_TryConnection" xml:space="preserve">
|
||||
<value>Versuche Verbindung zu Server</value>
|
||||
</data>
|
||||
<data name="AddUserPage_AddUser" xml:space="preserve">
|
||||
<value>Benutzer hinzufügen</value>
|
||||
</data>
|
||||
<data name="ALERT" xml:space="preserve">
|
||||
<value>Warnung</value>
|
||||
</data>
|
||||
<data name="ALERT_AddressInvalid" xml:space="preserve">
|
||||
<value>Server-Adresse ist ungültig.</value>
|
||||
</data>
|
||||
<data name="ALERT_AddUserFailed" xml:space="preserve">
|
||||
<value>Benutzer hinzufügen fehlgeschlagen.</value>
|
||||
</data>
|
||||
<data name="ALERT_AuthFailed" xml:space="preserve">
|
||||
<value>Authentifizierung fehlgeschlagen.</value>
|
||||
</data>
|
||||
<data name="ALERT_AuthServer" xml:space="preserve">
|
||||
<value>Authentifizierung beim Server nicht möglich.</value>
|
||||
</data>
|
||||
<data name="ALERT_BadMechanism" xml:space="preserve">
|
||||
<value>SASL Mechanismus nicht unterstützt.</value>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionFailed" xml:space="preserve">
|
||||
<value>Verbindung fehlgeschlagen.</value>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionTimeout" xml:space="preserve">
|
||||
<value>Verbindungszeit überschritten.</value>
|
||||
</data>
|
||||
<data name="ALERT_CredentialsInvalid" xml:space="preserve">
|
||||
<value>Anmeldeinformationen ungültig.</value>
|
||||
</data>
|
||||
<data name="ALERT_DuplicateConnection" xml:space="preserve">
|
||||
<value>Verbindung existiert bereits. Bitte alte Verbindung löschen, bevor neue Verbindung hinzugefügt wird.</value>
|
||||
</data>
|
||||
<data name="ALERT_ID" xml:space="preserve">
|
||||
<value>ID ist ungültig.</value>
|
||||
</data>
|
||||
<data name="ALERT_PasswordInvalid" xml:space="preserve">
|
||||
<value>Passwort ist ungültig.</value>
|
||||
</data>
|
||||
<data name="ALERT_QRInvalid" xml:space="preserve">
|
||||
<value>QR Code inst ungültig</value>
|
||||
</data>
|
||||
<data name="ALERT_SASLAuth" xml:space="preserve">
|
||||
<value>SASLAuthentifizierung fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ALERT_TLSInvalid" xml:space="preserve">
|
||||
<value>TLS-Zertifikat ist ungültig.</value>
|
||||
</data>
|
||||
<data name="ALERT_UnableServer" xml:space="preserve">
|
||||
<value>Verbindung zum Server kann nicht hergestellt werden.</value>
|
||||
</data>
|
||||
<data name="ALERT_UnexpectedError" xml:space="preserve">
|
||||
<value>Unerwarteter Fehler.</value>
|
||||
</data>
|
||||
<data name="ALERT_UserExist" xml:space="preserve">
|
||||
<value>Benutzer existiert bereits.</value>
|
||||
</data>
|
||||
<data name="ALERT_UsernameInvalid" xml:space="preserve">
|
||||
<value>Benutzername ungültig.</value>
|
||||
</data>
|
||||
<data name="Bionade" xml:space="preserve">
|
||||
<value>Es ist Bionade!</value>
|
||||
</data>
|
||||
<data name="BUILD" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="CANCEL" xml:space="preserve">
|
||||
<value>Abbrechen</value>
|
||||
</data>
|
||||
<data name="CONFIRM" xml:space="preserve">
|
||||
<value>Bestätigen</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_Connecting" xml:space="preserve">
|
||||
<value>Verbinde zu Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NoConnection" xml:space="preserve">
|
||||
<value>Keine Verbindung zu Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NotConnected" xml:space="preserve">
|
||||
<value>Bitte Server auswählen.</value>
|
||||
</data>
|
||||
<data name="DELETE" xml:space="preserve">
|
||||
<value>Löschen</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteServer" xml:space="preserve">
|
||||
<value>Server löschen</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteServerConfirm" xml:space="preserve">
|
||||
<value>Wollen Sie diesen Server wirklich löschen?</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteUser" xml:space="preserve">
|
||||
<value>Benutzer löschen</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteUserConfirm" xml:space="preserve">
|
||||
<value>Wollen Sie diesen Benutzer wirklich löschen?</value>
|
||||
</data>
|
||||
<data name="FABACCESS" xml:space="preserve">
|
||||
<value>FabAccess</value>
|
||||
</data>
|
||||
<data name="HOST" xml:space="preserve">
|
||||
<value>Host</value>
|
||||
</data>
|
||||
<data name="InUseByMe" xml:space="preserve">
|
||||
<value>Durch mich genutzt</value>
|
||||
</data>
|
||||
<data name="MACHINE" xml:space="preserve">
|
||||
<value>Maschine</value>
|
||||
</data>
|
||||
<data name="MachinePage_CanNotUseByPermission" xml:space="preserve">
|
||||
<value>Sie sind derzeit nicht berechtigt, dieses Gerät zu benutzen.
|
||||
Bitte sprechen Sie mit dem Personal im Space, um die erforderliche Schulung und Genehmigung zu erhalten.</value>
|
||||
</data>
|
||||
<data name="MachinePage_CurrentUser" xml:space="preserve">
|
||||
<value>Aktueller Benutzer:</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceBlock" xml:space="preserve">
|
||||
<value>Maschine blockieren</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceDisable" xml:space="preserve">
|
||||
<value>Maschine deaktivieren</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceFree" xml:space="preserve">
|
||||
<value>Maschine freigeben</value>
|
||||
</data>
|
||||
<data name="MachinePage_GiveBack" xml:space="preserve">
|
||||
<value>Maschine zurückgeben</value>
|
||||
</data>
|
||||
<data name="MachinePage_Identify" xml:space="preserve">
|
||||
<value>Lokalisieren</value>
|
||||
</data>
|
||||
<data name="MachinePage_LastUser" xml:space="preserve">
|
||||
<value>Letzter Benutzer:</value>
|
||||
</data>
|
||||
<data name="MachinePage_ManageMachine" xml:space="preserve">
|
||||
<value>Maschine verwalten:</value>
|
||||
</data>
|
||||
<data name="MachinePage_OpenWiki" xml:space="preserve">
|
||||
<value>Wiki öffnen</value>
|
||||
</data>
|
||||
<data name="MachinePage_Unlock" xml:space="preserve">
|
||||
<value>Entsperren</value>
|
||||
</data>
|
||||
<data name="MachinePage_Use" xml:space="preserve">
|
||||
<value>Benutzen</value>
|
||||
</data>
|
||||
<data name="MainPage_Build" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="MainPage_Machines" xml:space="preserve">
|
||||
<value>Maschinen</value>
|
||||
</data>
|
||||
<data name="MainPage_Profile" xml:space="preserve">
|
||||
<value>Mein Profil</value>
|
||||
</data>
|
||||
<data name="MainPage_Servers" xml:space="preserve">
|
||||
<value>Server</value>
|
||||
</data>
|
||||
<data name="MainPage_Users" xml:space="preserve">
|
||||
<value>Benutzer</value>
|
||||
</data>
|
||||
<data name="MainPage_Version" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="OK" xml:space="preserve">
|
||||
<value>Ok</value>
|
||||
</data>
|
||||
<data name="OR" xml:space="preserve">
|
||||
<value>oder</value>
|
||||
</data>
|
||||
<data name="PASSWORD" xml:space="preserve">
|
||||
<value>Passwort</value>
|
||||
</data>
|
||||
<data name="ProfilePage_ChangePassword" xml:space="preserve">
|
||||
<value>Passwort ändern</value>
|
||||
</data>
|
||||
<data name="ProfilePage_NewPassword" xml:space="preserve">
|
||||
<value>Neues Passwort</value>
|
||||
</data>
|
||||
<data name="ProfilePage_OldPassword" xml:space="preserve">
|
||||
<value>Altes Passwort</value>
|
||||
</data>
|
||||
<data name="ProfilePage_UpdatePassword" xml:space="preserve">
|
||||
<value>Passwort aktualisieren</value>
|
||||
</data>
|
||||
<data name="SCANQR" xml:space="preserve">
|
||||
<value>QR-Code scannen</value>
|
||||
</data>
|
||||
<data name="ServerListPage_ActiveConnection" xml:space="preserve">
|
||||
<value>Aktive Verbindung</value>
|
||||
</data>
|
||||
<data name="ServerListPage_ConnectToNewServer" xml:space="preserve">
|
||||
<value>Zu neuem Server verbinden</value>
|
||||
</data>
|
||||
<data name="ServerListPage_LastConnection" xml:space="preserve">
|
||||
<value>Letzte Verbindungen</value>
|
||||
</data>
|
||||
<data name="ServerPageModel_ConnectionFailed" xml:space="preserve">
|
||||
<value>Verbindung fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ServerPage_Connect" xml:space="preserve">
|
||||
<value>Verbinden</value>
|
||||
</data>
|
||||
<data name="ServerPage_DefaultText" xml:space="preserve">
|
||||
<value>Sie können einen Server als Standardserver festlegen, so dass die Anwendung beim Start automatisch eine Verbindung zu diesem Server herstellt.</value>
|
||||
</data>
|
||||
<data name="ServerPage_Disconnect" xml:space="preserve">
|
||||
<value>Verbindung trennen</value>
|
||||
</data>
|
||||
<data name="ServerPage_IsDefault" xml:space="preserve">
|
||||
<value>Diese Verbindung ist als Standard eingestellt, und FabAccess verbindet sich beim Starten automatisch mit diesem Server.</value>
|
||||
</data>
|
||||
<data name="ServerPage_SetDefault" xml:space="preserve">
|
||||
<value>Als Standardverbindung setzen</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_ScanPage_Button" xml:space="preserve">
|
||||
<value>In Space einloggen</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Button" xml:space="preserve">
|
||||
<value>Mit der Arbeit beginnen</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Text" xml:space="preserve">
|
||||
<value>FabAccess ist ein Maschinenverwaltungssystem, das für Makerspaces, Fablabs und andere kollaborative Arbeitsbereiche entwickelt wurde.
|
||||
|
||||
Mit FabAccess können Sie auf Maschinen zugreifen und diese planen, Benutzer verwalten und Echtzeit-Updates zu Maschinenstatus und -nutzung erhalten. Die Plattform bietet eine dezentralisierte Lösung für die Verwaltung von und den Zugriff auf Maschinen in verschiedenen Spaces und erleichtert den Nutzern die Zusammenarbeit und gemeinsame Innovation.</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Title" xml:space="preserve">
|
||||
<value>Willkommen bei FabAccess</value>
|
||||
</data>
|
||||
<data name="StartPage_Connecting" xml:space="preserve">
|
||||
<value>Verbinde zu Server</value>
|
||||
</data>
|
||||
<data name="StartPage_Starting" xml:space="preserve">
|
||||
<value>Anwendung wird gestartet</value>
|
||||
</data>
|
||||
<data name="TITLE_AddUser" xml:space="preserve">
|
||||
<value>Benutzer hinzufügen</value>
|
||||
</data>
|
||||
<data name="TITLE_ConnectToServer" xml:space="preserve">
|
||||
<value>Mit Server verbinden</value>
|
||||
</data>
|
||||
<data name="TITLE_Machine" xml:space="preserve">
|
||||
<value>Maschine</value>
|
||||
</data>
|
||||
<data name="TITLE_Machines" xml:space="preserve">
|
||||
<value>Maschinen</value>
|
||||
</data>
|
||||
<data name="TITLE_Profile" xml:space="preserve">
|
||||
<value>Mein Profil</value>
|
||||
</data>
|
||||
<data name="TITLE_Server" xml:space="preserve">
|
||||
<value>Server</value>
|
||||
</data>
|
||||
<data name="TITLE_Servers" xml:space="preserve">
|
||||
<value>Server</value>
|
||||
</data>
|
||||
<data name="TITLE_Settings" xml:space="preserve">
|
||||
<value>Einstellungen</value>
|
||||
</data>
|
||||
<data name="TITLE_User" xml:space="preserve">
|
||||
<value>Benutzer</value>
|
||||
</data>
|
||||
<data name="TITLE_Users" xml:space="preserve">
|
||||
<value>Benutzer</value>
|
||||
</data>
|
||||
<data name="Uncategorised" xml:space="preserve">
|
||||
<value>Unkategorisiert</value>
|
||||
</data>
|
||||
<data name="UserListPage_AddUser" xml:space="preserve">
|
||||
<value>Neuen Benutzer hinzufügen</value>
|
||||
</data>
|
||||
<data name="UserListPage_Search" xml:space="preserve">
|
||||
<value>Benutzer suchen</value>
|
||||
</data>
|
||||
<data name="UserListPage_SearchUser" xml:space="preserve">
|
||||
<value>Benutzername suchen ...</value>
|
||||
</data>
|
||||
<data name="USERNAME" xml:space="preserve">
|
||||
<value>Benutzername</value>
|
||||
</data>
|
||||
<data name="UserPage_ChangePassword" xml:space="preserve">
|
||||
<value>Passwort aktualisieren</value>
|
||||
</data>
|
||||
<data name="UserPage_CreateCard" xml:space="preserve">
|
||||
<value>Neue FabFire Card erzeugen</value>
|
||||
</data>
|
||||
<data name="UserPage_NewPassword" xml:space="preserve">
|
||||
<value>Neues Passwort</value>
|
||||
</data>
|
||||
<data name="UserPage_UnbindCard" xml:space="preserve">
|
||||
<value>FabFir eCard entkoppeln</value>
|
||||
</data>
|
||||
<data name="UserPage_UpdatePassword" xml:space="preserve">
|
||||
<value>Passwort Update erzwingen</value>
|
||||
</data>
|
||||
<data name="VERSION" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="YAY" xml:space="preserve">
|
||||
<value>YAY</value>
|
||||
</data>
|
||||
</root>
|
469
Borepin/Borepin/Resources/Text/TextResource.en.resx
Normal file
469
Borepin/Borepin/Resources/Text/TextResource.en.resx
Normal file
@ -0,0 +1,469 @@
|
||||
<?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="AddServerProcess_AuthPlainPage_Login" xml:space="preserve">
|
||||
<value>Login</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_LoginCard" xml:space="preserve">
|
||||
<value>Login with Card</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_LoginPassword" xml:space="preserve">
|
||||
<value>Login with Password</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_Register" xml:space="preserve">
|
||||
<value>Register</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_SignIn" xml:space="preserve">
|
||||
<value>Sign In:</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_ChooseAuthTypePage_SignUp" xml:space="preserve">
|
||||
<value>Sign Up:</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Connect" xml:space="preserve">
|
||||
<value>Connect to Server</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Info" xml:space="preserve">
|
||||
<value>FabAccess is a decentralized machine management system, which means that it is designed to allow each Space to have its own dedicated server for managing its machines. If you want to connect to the FabAccess server for a specific Space, you will need to obtain the host address from that particular Space.
|
||||
|
||||
In addition to being able to connect to individual servers, FabAccess also allows you to add multiple servers to your account. This feature is especially useful for makers and innovators who have access to machines at multiple Spaces.</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Placeholder" xml:space="preserve">
|
||||
<value>test.fab-access.org</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_TryConnection" xml:space="preserve">
|
||||
<value>Trying to connect to the server</value>
|
||||
</data>
|
||||
<data name="AddUserPage_AddUser" xml:space="preserve">
|
||||
<value>Add User</value>
|
||||
</data>
|
||||
<data name="ALERT" xml:space="preserve">
|
||||
<value>Alert</value>
|
||||
</data>
|
||||
<data name="ALERT_AddressInvalid" xml:space="preserve">
|
||||
<value>Server address is invaild.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_AddUserFailed" xml:space="preserve">
|
||||
<value>Add User failed.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_AuthFailed" xml:space="preserve">
|
||||
<value>Authentication failed.</value>
|
||||
<comment>Message Title</comment>
|
||||
</data>
|
||||
<data name="ALERT_AuthServer" xml:space="preserve">
|
||||
<value>Unable to authenticate to server.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_BadMechanism" xml:space="preserve">
|
||||
<value>SASL Mechanism is not supported.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionFailed" xml:space="preserve">
|
||||
<value>Connection failed.</value>
|
||||
<comment>Message Title</comment>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionTimeout" xml:space="preserve">
|
||||
<value>Connection time exceeded.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_CredentialsInvalid" xml:space="preserve">
|
||||
<value>Credentials are invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_DuplicateConnection" xml:space="preserve">
|
||||
<value>Connection already exist. Please delete old Connection before adding the new Connection.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_ID" xml:space="preserve">
|
||||
<value>ID is invalid.</value>
|
||||
</data>
|
||||
<data name="ALERT_PasswordInvalid" xml:space="preserve">
|
||||
<value>Password is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_QRInvalid" xml:space="preserve">
|
||||
<value>QR Code is invalid</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_SASLAuth" xml:space="preserve">
|
||||
<value>SASL Authentication failed</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_TLSInvalid" xml:space="preserve">
|
||||
<value>TLS certificate is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UnableServer" xml:space="preserve">
|
||||
<value>Unable to connect to server.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UnexpectedError" xml:space="preserve">
|
||||
<value>Unexpected Error.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UserExist" xml:space="preserve">
|
||||
<value>User already exist.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UsernameInvalid" xml:space="preserve">
|
||||
<value>Username is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="Bionade" xml:space="preserve">
|
||||
<value>It's Bionade!</value>
|
||||
</data>
|
||||
<data name="BUILD" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="CANCEL" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="CONFIRM" xml:space="preserve">
|
||||
<value>Confirm</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_Connecting" xml:space="preserve">
|
||||
<value>Connecting to Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NoConnection" xml:space="preserve">
|
||||
<value>No Connection to Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NotConnected" xml:space="preserve">
|
||||
<value>Please select a Server.</value>
|
||||
</data>
|
||||
<data name="DELETE" xml:space="preserve">
|
||||
<value>Delete</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteServer" xml:space="preserve">
|
||||
<value>Delete Server</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteServerConfirm" xml:space="preserve">
|
||||
<value>Do you really want to delete this Server?</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteUser" xml:space="preserve">
|
||||
<value>Delete User</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteUserConfirm" xml:space="preserve">
|
||||
<value>Do you really want to delete this User?</value>
|
||||
</data>
|
||||
<data name="FABACCESS" xml:space="preserve">
|
||||
<value>FabAccess</value>
|
||||
</data>
|
||||
<data name="HOST" xml:space="preserve">
|
||||
<value>Host</value>
|
||||
</data>
|
||||
<data name="InUseByMe" xml:space="preserve">
|
||||
<value>In Use By Me</value>
|
||||
</data>
|
||||
<data name="MACHINE" xml:space="preserve">
|
||||
<value>Machine</value>
|
||||
</data>
|
||||
<data name="MachinePage_CanNotUseByPermission" xml:space="preserve">
|
||||
<value>You are not currently authorized to use this machine.
|
||||
Please speak with the staff at the Space to receive the necessary training and authorization.</value>
|
||||
</data>
|
||||
<data name="MachinePage_CurrentUser" xml:space="preserve">
|
||||
<value>Current User:</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceBlock" xml:space="preserve">
|
||||
<value>Block Machine</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceDisable" xml:space="preserve">
|
||||
<value>Disable Machine</value>
|
||||
</data>
|
||||
<data name="MachinePage_ForceFree" xml:space="preserve">
|
||||
<value>Free Machine</value>
|
||||
</data>
|
||||
<data name="MachinePage_GiveBack" xml:space="preserve">
|
||||
<value>GiveBack</value>
|
||||
</data>
|
||||
<data name="MachinePage_Identify" xml:space="preserve">
|
||||
<value>Identify</value>
|
||||
</data>
|
||||
<data name="MachinePage_LastUser" xml:space="preserve">
|
||||
<value>Last User:</value>
|
||||
</data>
|
||||
<data name="MachinePage_ManageMachine" xml:space="preserve">
|
||||
<value>Manage Machine:</value>
|
||||
</data>
|
||||
<data name="MachinePage_OpenWiki" xml:space="preserve">
|
||||
<value>Open Wiki</value>
|
||||
</data>
|
||||
<data name="MachinePage_Unlock" xml:space="preserve">
|
||||
<value>Unlock</value>
|
||||
</data>
|
||||
<data name="MachinePage_Use" xml:space="preserve">
|
||||
<value>Use</value>
|
||||
</data>
|
||||
<data name="MainPage_Build" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="MainPage_Machines" xml:space="preserve">
|
||||
<value>Machines</value>
|
||||
</data>
|
||||
<data name="MainPage_Profile" xml:space="preserve">
|
||||
<value>My Profile</value>
|
||||
</data>
|
||||
<data name="MainPage_Servers" xml:space="preserve">
|
||||
<value>Servers</value>
|
||||
</data>
|
||||
<data name="MainPage_Users" xml:space="preserve">
|
||||
<value>Users</value>
|
||||
</data>
|
||||
<data name="MainPage_Version" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="OK" xml:space="preserve">
|
||||
<value>Ok</value>
|
||||
</data>
|
||||
<data name="OR" xml:space="preserve">
|
||||
<value>or</value>
|
||||
</data>
|
||||
<data name="PASSWORD" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="ProfilePage_ChangePassword" xml:space="preserve">
|
||||
<value>Change Password</value>
|
||||
</data>
|
||||
<data name="ProfilePage_NewPassword" xml:space="preserve">
|
||||
<value>New Password</value>
|
||||
</data>
|
||||
<data name="ProfilePage_OldPassword" xml:space="preserve">
|
||||
<value>Old Password</value>
|
||||
</data>
|
||||
<data name="ProfilePage_UpdatePassword" xml:space="preserve">
|
||||
<value>Update Password</value>
|
||||
</data>
|
||||
<data name="SCANQR" xml:space="preserve">
|
||||
<value>Scan QR-Code</value>
|
||||
</data>
|
||||
<data name="ServerListPage_ActiveConnection" xml:space="preserve">
|
||||
<value>Active Connection</value>
|
||||
</data>
|
||||
<data name="ServerListPage_ConnectToNewServer" xml:space="preserve">
|
||||
<value>Connect to new Server</value>
|
||||
</data>
|
||||
<data name="ServerListPage_LastConnection" xml:space="preserve">
|
||||
<value>Last Connections</value>
|
||||
</data>
|
||||
<data name="ServerPageModel_ConnectionFailed" xml:space="preserve">
|
||||
<value>Connection failed</value>
|
||||
</data>
|
||||
<data name="ServerPage_Connect" xml:space="preserve">
|
||||
<value>Connect</value>
|
||||
</data>
|
||||
<data name="ServerPage_DefaultText" xml:space="preserve">
|
||||
<value>You can set a server as the default server and then the app will automatically connect to that server upon startup.</value>
|
||||
</data>
|
||||
<data name="ServerPage_Disconnect" xml:space="preserve">
|
||||
<value>Disconnect</value>
|
||||
</data>
|
||||
<data name="ServerPage_IsDefault" xml:space="preserve">
|
||||
<value>This connection has been set as the default and FabAccess will automatically connect to this server upon startup.</value>
|
||||
</data>
|
||||
<data name="ServerPage_SetDefault" xml:space="preserve">
|
||||
<value>Set as Default Connection</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_ScanPage_Button" xml:space="preserve">
|
||||
<value>Login to your Space</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Button" xml:space="preserve">
|
||||
<value>Begin working</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Text" xml:space="preserve">
|
||||
<value>FabAccess is a machine management system designed for makerspaces, fablab and other collaborative workspaces.
|
||||
|
||||
With FabAccess, you can access and schedule machines, manage users and receive real-time updates on machine status and usage. The platform provides a decentralized solution for managing and connecting to machines across different Spaces, making it easier for users to collaborate and innovate together.</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Title" xml:space="preserve">
|
||||
<value>Welcome to FabAccess</value>
|
||||
</data>
|
||||
<data name="StartPage_Connecting" xml:space="preserve">
|
||||
<value>Connecting to Server</value>
|
||||
</data>
|
||||
<data name="StartPage_Starting" xml:space="preserve">
|
||||
<value>Starting App</value>
|
||||
</data>
|
||||
<data name="TITLE_AddUser" xml:space="preserve">
|
||||
<value>Add User</value>
|
||||
</data>
|
||||
<data name="TITLE_ConnectToServer" xml:space="preserve">
|
||||
<value>Connect to Server</value>
|
||||
</data>
|
||||
<data name="TITLE_Machine" xml:space="preserve">
|
||||
<value>Machine</value>
|
||||
</data>
|
||||
<data name="TITLE_Machines" xml:space="preserve">
|
||||
<value>Machines</value>
|
||||
</data>
|
||||
<data name="TITLE_Profile" xml:space="preserve">
|
||||
<value>My Profile</value>
|
||||
</data>
|
||||
<data name="TITLE_Server" xml:space="preserve">
|
||||
<value>Server</value>
|
||||
</data>
|
||||
<data name="TITLE_Servers" xml:space="preserve">
|
||||
<value>Servers</value>
|
||||
</data>
|
||||
<data name="TITLE_Settings" xml:space="preserve">
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name="TITLE_User" xml:space="preserve">
|
||||
<value>User</value>
|
||||
</data>
|
||||
<data name="TITLE_Users" xml:space="preserve">
|
||||
<value>Users</value>
|
||||
</data>
|
||||
<data name="Uncategorised" xml:space="preserve">
|
||||
<value>Uncategorised</value>
|
||||
</data>
|
||||
<data name="UserListPage_AddUser" xml:space="preserve">
|
||||
<value>Add new User</value>
|
||||
</data>
|
||||
<data name="UserListPage_Search" xml:space="preserve">
|
||||
<value>Search User</value>
|
||||
</data>
|
||||
<data name="UserListPage_SearchUser" xml:space="preserve">
|
||||
<value>Search Username ...</value>
|
||||
</data>
|
||||
<data name="USERNAME" xml:space="preserve">
|
||||
<value>Username</value>
|
||||
</data>
|
||||
<data name="UserPage_ChangePassword" xml:space="preserve">
|
||||
<value>Update Password</value>
|
||||
</data>
|
||||
<data name="UserPage_CreateCard" xml:space="preserve">
|
||||
<value>Create new FabFire Card</value>
|
||||
</data>
|
||||
<data name="UserPage_NewPassword" xml:space="preserve">
|
||||
<value>New Password</value>
|
||||
</data>
|
||||
<data name="UserPage_UnbindCard" xml:space="preserve">
|
||||
<value>Unbind FabFire Card</value>
|
||||
</data>
|
||||
<data name="UserPage_UpdatePassword" xml:space="preserve">
|
||||
<value>Force Password Update</value>
|
||||
</data>
|
||||
<data name="VERSION" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="YAY" xml:space="preserve">
|
||||
<value>YAY</value>
|
||||
</data>
|
||||
</root>
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
@ -139,9 +139,15 @@
|
||||
<value>Connect to Server</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Info" xml:space="preserve">
|
||||
<value>FabAccess is a decentralized machine management system. Each Space thus uses its own server.
|
||||
Ask your Space for the address of your server.
|
||||
You can also put down several servers and then connect to the desired server.</value>
|
||||
<value>FabAccess is a decentralized machine management system, which means that it is designed to allow each Space to have its own dedicated server for managing its machines. If you want to connect to the FabAccess server for a specific Space, you will need to obtain the host address from that particular Space.
|
||||
|
||||
In addition to being able to connect to individual servers, FabAccess also allows you to add multiple servers to your account. This feature is especially useful for makers and innovators who have access to machines at multiple Spaces.</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_Placeholder" xml:space="preserve">
|
||||
<value>test.fab-access.org</value>
|
||||
</data>
|
||||
<data name="AddServerProcess_SelectServerPage_TryConnection" xml:space="preserve">
|
||||
<value>Trying to connect to the server</value>
|
||||
</data>
|
||||
<data name="AddUserPage_AddUser" xml:space="preserve">
|
||||
<value>Add User</value>
|
||||
@ -151,39 +157,77 @@ You can also put down several servers and then connect to the desired server.</v
|
||||
</data>
|
||||
<data name="ALERT_AddressInvalid" xml:space="preserve">
|
||||
<value>Server address is invaild.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_AddUserFailed" xml:space="preserve">
|
||||
<value>Add User failed</value>
|
||||
<value>Add User failed.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_AuthFailed" xml:space="preserve">
|
||||
<value>Authentication failed.</value>
|
||||
<comment>Message Title</comment>
|
||||
</data>
|
||||
<data name="ALERT_AuthServer" xml:space="preserve">
|
||||
<value>Unable to authenticate to server.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_BadMechanism" xml:space="preserve">
|
||||
<value>SASL Mechanism is not supported.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionFailed" xml:space="preserve">
|
||||
<value>Connection failed</value>
|
||||
<value>Connection failed.</value>
|
||||
<comment>Message Title</comment>
|
||||
</data>
|
||||
<data name="ALERT_ConnectionTimeout" xml:space="preserve">
|
||||
<value>Connection time exceeded.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_CredentialsInvalid" xml:space="preserve">
|
||||
<value>Credentials are invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_DuplicateConnection" xml:space="preserve">
|
||||
<value>Connection already exist. Please delete old Connection before adding the new Connection.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_ID" xml:space="preserve">
|
||||
<value>ID is invalid.</value>
|
||||
</data>
|
||||
<data name="ALERT_PasswordInvalid" xml:space="preserve">
|
||||
<value>Password is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="Alert_QRInvalid" xml:space="preserve">
|
||||
<data name="ALERT_QRInvalid" xml:space="preserve">
|
||||
<value>QR Code is invalid</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_SASLAuth" xml:space="preserve">
|
||||
<value>SASL Authentication failed</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_TLSInvalid" xml:space="preserve">
|
||||
<value>TLS certificate is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UnableServer" xml:space="preserve">
|
||||
<value>Unable to connect to server.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UnexpectedError" xml:space="preserve">
|
||||
<value>Unexpected Error.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UserExist" xml:space="preserve">
|
||||
<value>User allready exist.</value>
|
||||
<value>User already exist.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="ALERT_UsernameInvalid" xml:space="preserve">
|
||||
<value>Username is invalid.</value>
|
||||
<comment>Message Content</comment>
|
||||
</data>
|
||||
<data name="Bionade" xml:space="preserve">
|
||||
<value>It's Bionade</value>
|
||||
<value>It's Bionade!</value>
|
||||
</data>
|
||||
<data name="BUILD" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
@ -194,6 +238,15 @@ You can also put down several servers and then connect to the desired server.</v
|
||||
<data name="CONFIRM" xml:space="preserve">
|
||||
<value>Confirm</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_Connecting" xml:space="preserve">
|
||||
<value>Connecting to Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NoConnection" xml:space="preserve">
|
||||
<value>No Connection to Server</value>
|
||||
</data>
|
||||
<data name="ConnectionStatus_NotConnected" xml:space="preserve">
|
||||
<value>Please select a Server.</value>
|
||||
</data>
|
||||
<data name="DELETE" xml:space="preserve">
|
||||
<value>Delete</value>
|
||||
</data>
|
||||
@ -201,7 +254,7 @@ You can also put down several servers and then connect to the desired server.</v
|
||||
<value>Delete Server</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteServerConfirm" xml:space="preserve">
|
||||
<value>"Do you really want to delete this Server?"</value>
|
||||
<value>Do you really want to delete this Server?</value>
|
||||
</data>
|
||||
<data name="DIALOG_DeleteUser" xml:space="preserve">
|
||||
<value>Delete User</value>
|
||||
@ -218,9 +271,12 @@ You can also put down several servers and then connect to the desired server.</v
|
||||
<data name="InUseByMe" xml:space="preserve">
|
||||
<value>In Use By Me</value>
|
||||
</data>
|
||||
<data name="MACHINE" xml:space="preserve">
|
||||
<value>Machine</value>
|
||||
</data>
|
||||
<data name="MachinePage_CanNotUseByPermission" xml:space="preserve">
|
||||
<value>You do not have the authorization to use this machine.
|
||||
Ask in your Space if you can be trained on the machine to be unlocked for the machine.</value>
|
||||
<value>You are not currently authorized to use this machine.
|
||||
Please speak with the staff at the Space to receive the necessary training and authorization.</value>
|
||||
</data>
|
||||
<data name="MachinePage_CurrentUser" xml:space="preserve">
|
||||
<value>Current User:</value>
|
||||
@ -237,6 +293,9 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<data name="MachinePage_GiveBack" xml:space="preserve">
|
||||
<value>GiveBack</value>
|
||||
</data>
|
||||
<data name="MachinePage_Identify" xml:space="preserve">
|
||||
<value>Identify</value>
|
||||
</data>
|
||||
<data name="MachinePage_LastUser" xml:space="preserve">
|
||||
<value>Last User:</value>
|
||||
</data>
|
||||
@ -246,6 +305,9 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<data name="MachinePage_OpenWiki" xml:space="preserve">
|
||||
<value>Open Wiki</value>
|
||||
</data>
|
||||
<data name="MachinePage_Unlock" xml:space="preserve">
|
||||
<value>Unlock</value>
|
||||
</data>
|
||||
<data name="MachinePage_Use" xml:space="preserve">
|
||||
<value>Use</value>
|
||||
</data>
|
||||
@ -276,9 +338,6 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<data name="PASSWORD" xml:space="preserve">
|
||||
<value>Password</value>
|
||||
</data>
|
||||
<data name="PLEASECONNECTTOSERVER" xml:space="preserve">
|
||||
<value>Please connect to Server</value>
|
||||
</data>
|
||||
<data name="ProfilePage_ChangePassword" xml:space="preserve">
|
||||
<value>Change Password</value>
|
||||
</data>
|
||||
@ -309,11 +368,14 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<data name="ServerPage_Connect" xml:space="preserve">
|
||||
<value>Connect</value>
|
||||
</data>
|
||||
<data name="ServerPage_DefaultText" xml:space="preserve">
|
||||
<value>You can set a server as the default server and then the app will automatically connect to that server upon startup.</value>
|
||||
</data>
|
||||
<data name="ServerPage_Disconnect" xml:space="preserve">
|
||||
<value>Disconnect</value>
|
||||
</data>
|
||||
<data name="ServerPage_IsDefault" xml:space="preserve">
|
||||
<value>Is Default Connection</value>
|
||||
<value>This connection has been set as the default and FabAccess will automatically connect to this server upon startup.</value>
|
||||
</data>
|
||||
<data name="ServerPage_SetDefault" xml:space="preserve">
|
||||
<value>Set as Default Connection</value>
|
||||
@ -325,10 +387,12 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<value>Begin working</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Text" xml:space="preserve">
|
||||
<value>Automate your Space with FabAccess</value>
|
||||
<value>FabAccess is a machine management system designed for makerspaces, fablab and other collaborative workspaces.
|
||||
|
||||
With FabAccess, you can access and schedule machines, manage users and receive real-time updates on machine status and usage. The platform provides a decentralized solution for managing and connecting to machines across different Spaces, making it easier for users to collaborate and innovate together.</value>
|
||||
</data>
|
||||
<data name="SetUpProcess_WelcomePage_Title" xml:space="preserve">
|
||||
<value>Welcome</value>
|
||||
<value>Welcome to FabAccess</value>
|
||||
</data>
|
||||
<data name="StartPage_Connecting" xml:space="preserve">
|
||||
<value>Connecting to Server</value>
|
||||
@ -370,7 +434,13 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<value>Uncategorised</value>
|
||||
</data>
|
||||
<data name="UserListPage_AddUser" xml:space="preserve">
|
||||
<value>Add User</value>
|
||||
<value>Add new User</value>
|
||||
</data>
|
||||
<data name="UserListPage_Search" xml:space="preserve">
|
||||
<value>Search User</value>
|
||||
</data>
|
||||
<data name="UserListPage_SearchUser" xml:space="preserve">
|
||||
<value>Search Username ...</value>
|
||||
</data>
|
||||
<data name="USERNAME" xml:space="preserve">
|
||||
<value>Username</value>
|
||||
@ -378,9 +448,15 @@ Ask in your Space if you can be trained on the machine to be unlocked for the ma
|
||||
<data name="UserPage_ChangePassword" xml:space="preserve">
|
||||
<value>Update Password</value>
|
||||
</data>
|
||||
<data name="UserPage_CreateCard" xml:space="preserve">
|
||||
<value>Create new FabFire Card</value>
|
||||
</data>
|
||||
<data name="UserPage_NewPassword" xml:space="preserve">
|
||||
<value>New Password</value>
|
||||
</data>
|
||||
<data name="UserPage_UnbindCard" xml:space="preserve">
|
||||
<value>Unbind FabFire Card</value>
|
||||
</data>
|
||||
<data name="UserPage_UpdatePassword" xml:space="preserve">
|
||||
<value>Force Password Update</value>
|
||||
</data>
|
||||
|
108
Borepin/Borepin/Service/ErrorMessage/ErrorMessageService.cs
Normal file
108
Borepin/Borepin/Service/ErrorMessage/ErrorMessageService.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using Capnp.Rpc;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using Prism.Services;
|
||||
using Xamarin.Forms;
|
||||
|
||||
namespace Borepin.Service.ErrorMessage
|
||||
{
|
||||
public class ErrorMessageService : IErrorMessageService
|
||||
{
|
||||
#region Private Members
|
||||
private IPageDialogService _PageDialogService;
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
public ErrorMessageService(IPageDialogService pageDialogService)
|
||||
{
|
||||
_PageDialogService = pageDialogService;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods to Display Connection Error
|
||||
|
||||
public void DisplayConnectFailedMessage(System.Exception exception)
|
||||
{
|
||||
if(exception is ConnectionException)
|
||||
{
|
||||
DisplayConnectionMessage(exception as ConnectionException);
|
||||
}
|
||||
else if(exception is AuthenticationException)
|
||||
{
|
||||
DisplayAuthenticationMessage(exception as AuthenticationException);
|
||||
}
|
||||
else
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnexpectedError, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void DisplayAuthenticationMessage(AuthenticationException exception)
|
||||
{
|
||||
if (exception.InnerException is BadMechanismException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_AuthFailed, Resources.Text.TextResource.ALERT_BadMechanism, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else if (exception.InnerException is InvalidCredentialsException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_AuthFailed, Resources.Text.TextResource.ALERT_CredentialsInvalid, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else if (exception.InnerException is AuthenticationFailedException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_AuthFailed, Resources.Text.TextResource.ALERT_SASLAuth, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_AuthFailed, Resources.Text.TextResource.ALERT_UnexpectedError, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public void DisplayConnectionMessage(ConnectionException exception)
|
||||
{
|
||||
if(exception.InnerException is System.Security.Authentication.AuthenticationException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_TLSInvalid, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else if(exception.InnerException is FabAccessAPI.Exceptions.TimeoutException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_ConnectionTimeout, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else if(exception.InnerException is RpcException)
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnableServer, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Device.BeginInvokeOnMainThread(async () =>
|
||||
{
|
||||
await _PageDialogService.DisplayAlertAsync(Resources.Text.TextResource.ALERT_ConnectionFailed, Resources.Text.TextResource.ALERT_UnexpectedError, Resources.Text.TextResource.OK).ConfigureAwait(false);
|
||||
});
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
14
Borepin/Borepin/Service/ErrorMessage/IErrorMessageService.cs
Normal file
14
Borepin/Borepin/Service/ErrorMessage/IErrorMessageService.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using FabAccessAPI.Exceptions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Borepin.Service.ErrorMessage
|
||||
{
|
||||
public interface IErrorMessageService
|
||||
{
|
||||
void DisplayConnectFailedMessage(Exception exception);
|
||||
void DisplayConnectionMessage(ConnectionException exception);
|
||||
void DisplayAuthenticationMessage(AuthenticationException exception);
|
||||
}
|
||||
}
|
33
Borepin/Borepin/View/ConnectionStateView.xaml
Normal file
33
Borepin/Borepin/View/ConnectionStateView.xaml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||
x:Class="Borepin.View.ConnectionStateView"
|
||||
xmlns:converters="clr-namespace:Borepin.Converter"
|
||||
xmlns:resource_text="clr-namespace:Borepin.Resources.Text">
|
||||
<ContentView.Resources>
|
||||
<ResourceDictionary>
|
||||
<converters:AllTrueBoolConverter x:Key="AllTrueBoolConverter"/>
|
||||
<converters:InvertBoolConverter x:Key="InvertBoolConverter"/>
|
||||
</ResourceDictionary>
|
||||
</ContentView.Resources>
|
||||
<ContentView.Content>
|
||||
<StackLayout>
|
||||
<StackLayout IsVisible="{Binding IsBusy}">
|
||||
<ActivityIndicator IsRunning="{Binding IsBusy}"/>
|
||||
</StackLayout>
|
||||
|
||||
<StackLayout>
|
||||
<StackLayout.IsVisible>
|
||||
<MultiBinding Converter="{StaticResource AllTrueBoolConverter}">
|
||||
<Binding Path="IsBusy" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
<Binding Path="IsConnected" Converter="{StaticResource InvertBoolConverter}"/>
|
||||
</MultiBinding>
|
||||
</StackLayout.IsVisible>
|
||||
<Label Text="{x:Static resource_text:TextResource.ConnectionStatus_NoConnection}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<Label Text="{x:Static resource_text:TextResource.ConnectionStatus_Connecting}" IsVisible="{Binding IsConnecting}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
<ActivityIndicator IsRunning="{Binding IsConnecting}" IsVisible="{Binding IsConnecting}"/>
|
||||
<Label Text="{x:Static resource_text:TextResource.ConnectionStatus_NotConnected}" IsVisible="{Binding IsConnecting, Converter={StaticResource InvertBoolConverter}}" Style="{StaticResource Style_Label_Text_Center}"/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
</ContentView.Content>
|
||||
</ContentView>
|
20
Borepin/Borepin/View/ConnectionStateView.xaml.cs
Normal file
20
Borepin/Borepin/View/ConnectionStateView.xaml.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.Xaml;
|
||||
|
||||
namespace Borepin.View
|
||||
{
|
||||
[XamlCompilation(XamlCompilationOptions.Compile)]
|
||||
public partial class ConnectionStateView : ContentView
|
||||
{
|
||||
public ConnectionStateView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||
<PackageReference Include="NSubstitute" Version="4.3.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
|
||||
<PackageReference Include="NSubstitute" Version="4.4.0" />
|
||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.3.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
23
CHANGELOG.md
Normal file
23
CHANGELOG.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Revision history for Borepin
|
||||
|
||||
## 0.3.11 -- 2023-03-17
|
||||
Final INTERFACER Release
|
||||
|
||||
### Features
|
||||
* improved API
|
||||
* create and bind SmartCards to users
|
||||
* improved UI
|
||||
* brand and template UI with theme file
|
||||
|
||||
### Updates
|
||||
* create DES-Fire Cards with FabFire-Protocol
|
||||
* identify machines with NTAG
|
||||
* unlock machines with electric locks
|
||||
* search for users
|
||||
* bind and unbind FabFire-Card to users
|
||||
* reconnect to server if connection is lost
|
||||
* autoconnect to server on client start
|
||||
* improved feedback for users if client lost connection
|
||||
|
||||
## 0.3.5 -- 2022-07-12
|
||||
Beta INTERFACER Release
|
@ -1,13 +1,14 @@
|
||||
using Capnp.Rpc;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using FabAccessAPI.Schema;
|
||||
using NLog;
|
||||
using S22.Sasl;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Security;
|
||||
using System.Security.Authentication;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@ -21,49 +22,76 @@ namespace FabAccessAPI
|
||||
#endregion
|
||||
|
||||
#region Private Members
|
||||
/// <summary>
|
||||
/// Internal client to connect to a server with TCP and RPC
|
||||
/// </summary>
|
||||
private TcpRpcClient _TcpRpcClient;
|
||||
|
||||
/// <summary>
|
||||
/// Private ConnectionData
|
||||
/// </summary>
|
||||
private ConnectionData _ConnectionData;
|
||||
|
||||
/// <summary>
|
||||
/// Private ServerData
|
||||
/// </summary>
|
||||
private ServerData _ServerData;
|
||||
|
||||
/// <summary>
|
||||
/// Private Session
|
||||
/// </summary>
|
||||
private Session _Session;
|
||||
|
||||
/// <summary>
|
||||
/// Private Bootstrap
|
||||
/// </summary>
|
||||
private IBootstrap _Bootstrap;
|
||||
|
||||
/// <summary>
|
||||
/// Timer to check connection status
|
||||
/// </summary>
|
||||
private readonly Timer _ConnectionHeatbeat;
|
||||
|
||||
/// <summary>
|
||||
/// Semaphore to connect only once
|
||||
/// </summary>
|
||||
private static SemaphoreSlim _ConnectSemaphore = new SemaphoreSlim(1, 1);
|
||||
private static SemaphoreSlim _ReconnectSemaphore = new SemaphoreSlim(1, 1);
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
public API()
|
||||
{
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
public event EventHandler<ConnectionStatusChange> ConnectionStatusChanged;
|
||||
|
||||
public void OnTcpRpcConnectionChanged(object sender, ConnectionStateChange args)
|
||||
{
|
||||
if (args.LastState == ConnectionState.Active && args.NewState == ConnectionState.Down)
|
||||
{
|
||||
Log.Trace("TcpRpcClient Event ConnectionLoss");
|
||||
ConnectionStatusChanged?.Invoke(this, ConnectionStatusChange.ConnectionLoss);
|
||||
_TcpRpcClient = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void UnbindAllEvents()
|
||||
{
|
||||
if(ConnectionStatusChanged != null)
|
||||
{
|
||||
foreach (Delegate d in ConnectionStatusChanged.GetInvocationList())
|
||||
{
|
||||
ConnectionStatusChanged -= (EventHandler<ConnectionStatusChange>)d;
|
||||
}
|
||||
}
|
||||
_ConnectionHeatbeat = new Timer(Heartbeat, null, 1000, 1000);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Members
|
||||
public ConnectionData ConnectionData { get; private set; }
|
||||
/// <summary>
|
||||
/// State of the conneciton, can the API-Service connect to a server
|
||||
/// </summary>
|
||||
public bool CanConnect
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ConnectionData != null;
|
||||
}
|
||||
}
|
||||
|
||||
public ConnectionInfo ConnectionInfo { get; private set; }
|
||||
/// <summary>
|
||||
/// State of the conneciton, is the API-Service connecting to a server
|
||||
/// </summary>
|
||||
public bool IsConnecting
|
||||
{
|
||||
get
|
||||
{
|
||||
return _TcpRpcClient != null && _ConnectionData != null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// State of the conneciton, is the API-Service connected to a server
|
||||
/// </summary>
|
||||
public bool IsConnected
|
||||
{
|
||||
get
|
||||
@ -72,15 +100,124 @@ namespace FabAccessAPI
|
||||
}
|
||||
}
|
||||
|
||||
public Session Session { get; private set; }
|
||||
/// <summary>
|
||||
/// Information about the connection
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected or trying to connected to a server </exception>
|
||||
public ConnectionData ConnectionData
|
||||
{
|
||||
get
|
||||
{
|
||||
if(_ConnectionData == null || !IsConnecting)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
else
|
||||
{
|
||||
return _ConnectionData;
|
||||
}
|
||||
}
|
||||
private set
|
||||
{
|
||||
_ConnectionData = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Information about the server
|
||||
/// Is only avalible if the API-Service is connected
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected </exception>
|
||||
public ServerData ServerData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_ServerData == null || !IsConnected)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
else
|
||||
{
|
||||
return _ServerData;
|
||||
}
|
||||
}
|
||||
private set
|
||||
{
|
||||
_ServerData = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
/// <summary>
|
||||
/// Event on changes in connection status
|
||||
/// </summary>
|
||||
public event EventHandler<ConnectionStatusChanged> ConnectionStatusChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Unbind all handlers from EventHandler<ConnectionStatusChanged>
|
||||
/// </summary>
|
||||
public void UnbindEventHandler()
|
||||
{
|
||||
if (ConnectionStatusChanged != null)
|
||||
{
|
||||
Log.Trace("Eventhandlers unbinded");
|
||||
foreach (Delegate d in ConnectionStatusChanged.GetInvocationList())
|
||||
{
|
||||
ConnectionStatusChanged -= (EventHandler<ConnectionStatusChanged>)d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Eventhandler for TcpRpcConnectionChanged
|
||||
/// Track connection loss and publish i in ConnectionStatusChanged
|
||||
/// </summary>
|
||||
public void OnTcpRpcConnectionChanged(object sender, ConnectionStateChange args)
|
||||
{
|
||||
if (args.LastState == ConnectionState.Active && args.NewState == ConnectionState.Down)
|
||||
{
|
||||
Log.Trace("TcpRpcClient Event ConnectionLoss");
|
||||
ConnectionStatusChanged?.Invoke(this, FabAccessAPI.ConnectionStatusChanged.ConnectionLoss);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Session
|
||||
/// <summary>
|
||||
/// Get session after connection
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected </exception>
|
||||
public Session Session
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_Session == null || !IsConnected)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
else
|
||||
{
|
||||
return _Session;
|
||||
}
|
||||
}
|
||||
private set
|
||||
{
|
||||
_Session = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <summary>
|
||||
/// Connect to server with ConnectionData
|
||||
/// If connection lost, the API-Server will try to reconnect
|
||||
/// </summary>
|
||||
/// <exception cref="AuthenticationException"></exception>
|
||||
/// <exception cref="ConnectingFailedException"></exception>
|
||||
/// <param name="connectionData"> Data to establish a connection to a server </param>
|
||||
/// <exception cref="ConnectionException"> When API-Service can not connect to a server </exception>
|
||||
/// <exception cref="AuthenticationException"> When API-Service can connect to a server but can not authenticate </exception>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is allready connected </exception>
|
||||
public async Task Connect(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null)
|
||||
{
|
||||
await _ConnectSemaphore.WaitAsync();
|
||||
@ -88,7 +225,8 @@ namespace FabAccessAPI
|
||||
{
|
||||
if (IsConnected)
|
||||
{
|
||||
await Disconnect();
|
||||
Log.Warn("API already connected");
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
|
||||
if (tcpRpcClient == null)
|
||||
@ -101,20 +239,19 @@ namespace FabAccessAPI
|
||||
await _ConnectAsync(tcpRpcClient, connectionData).ConfigureAwait(false);
|
||||
|
||||
_Bootstrap = tcpRpcClient.GetMain<IBootstrap>();
|
||||
ConnectionInfo = await _GetConnectionInfo(_Bootstrap);
|
||||
ServerData = await _GetServerData(_Bootstrap);
|
||||
|
||||
Session = await _Authenticate(connectionData).ConfigureAwait(false);
|
||||
ConnectionData = connectionData;
|
||||
|
||||
_TcpRpcClient = tcpRpcClient;
|
||||
tcpRpcClient.ConnectionStateChanged += OnTcpRpcConnectionChanged;
|
||||
ConnectionStatusChanged?.Invoke(this, ConnectionStatusChange.Connected);
|
||||
ConnectionStatusChanged?.Invoke(this, FabAccessAPI.ConnectionStatusChanged.Connected);
|
||||
Log.Info("API connected");
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
await Disconnect().ConfigureAwait(false);
|
||||
Log.Warn(ex, "API connecting failed");
|
||||
Log.Warn(ex, "API connect failed");
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
@ -124,6 +261,10 @@ namespace FabAccessAPI
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Disconnect from a server
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected or trying to connect </exception>
|
||||
public Task Disconnect()
|
||||
{
|
||||
if (IsConnected)
|
||||
@ -132,41 +273,24 @@ namespace FabAccessAPI
|
||||
}
|
||||
|
||||
_Bootstrap = null;
|
||||
Session = null;
|
||||
_TcpRpcClient = null;
|
||||
ConnectionData = null;
|
||||
ConnectionInfo = null;
|
||||
|
||||
ConnectionStatusChanged?.Invoke(this, ConnectionStatusChange.Disconnected);
|
||||
Session = null;
|
||||
ConnectionData = null;
|
||||
ServerData = null;
|
||||
|
||||
ConnectionStatusChanged?.Invoke(this, FabAccessAPI.ConnectionStatusChanged.Disconnected);
|
||||
|
||||
Log.Info("API disconnected");
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public async Task Reconnect()
|
||||
{
|
||||
await _ReconnectSemaphore.WaitAsync();
|
||||
try
|
||||
{
|
||||
if (ConnectionData != null && IsConnected == false)
|
||||
{
|
||||
await Connect(ConnectionData);
|
||||
}
|
||||
|
||||
ConnectionStatusChanged?.Invoke(this, ConnectionStatusChange.Reconnected);
|
||||
Log.Info("API reconnected");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_ReconnectSemaphore.Release();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async Task<ConnectionInfo> TestConnection(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null)
|
||||
{
|
||||
try
|
||||
/// <summary>
|
||||
/// Try to connect to a server and get ServerData
|
||||
/// The connection is not maintained
|
||||
/// </summary>
|
||||
/// <exception cref="ConnectionException"> When API-Service can not connect to a server </exception>
|
||||
public async Task<ServerData> TryToConnect(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null)
|
||||
{
|
||||
if (tcpRpcClient == null)
|
||||
{
|
||||
@ -174,103 +298,133 @@ namespace FabAccessAPI
|
||||
}
|
||||
|
||||
await _ConnectAsync(tcpRpcClient, connectionData).ConfigureAwait(false);
|
||||
IBootstrap testBootstrap = tcpRpcClient.GetMain<IBootstrap>();
|
||||
IBootstrap bootstrap = tcpRpcClient.GetMain<IBootstrap>();
|
||||
|
||||
ConnectionInfo connectionInfo = await _GetConnectionInfo(testBootstrap).ConfigureAwait(false);
|
||||
ServerData serverData = await _GetServerData(bootstrap).ConfigureAwait(false);
|
||||
|
||||
tcpRpcClient.Dispose();
|
||||
|
||||
return connectionInfo;
|
||||
return serverData;
|
||||
}
|
||||
catch
|
||||
|
||||
/// <summary>
|
||||
/// Public Wrapper to run HeartbeatAsync
|
||||
/// </summary>
|
||||
public void Heartbeat(object state)
|
||||
{
|
||||
throw new ConnectingFailedException();
|
||||
}
|
||||
_ = HeartbeatAsync();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
|
||||
|
||||
private async Task HeartbeatAsync()
|
||||
{
|
||||
if(!IsConnected && CanConnect)
|
||||
{
|
||||
try
|
||||
{
|
||||
await Connect(ConnectionData).ConfigureAwait(false);
|
||||
}
|
||||
catch(AuthenticationException)
|
||||
{
|
||||
await Disconnect().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validate Certificate
|
||||
/// TODO: Do some validation
|
||||
/// </summary>
|
||||
private static bool _RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
||||
private bool _RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
||||
{
|
||||
// TODO Cert Check
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Connect to server async with ConnectionData
|
||||
/// Injects SSL as Midlayer in TCPRPCConnection
|
||||
/// </summary>
|
||||
/// <exception cref="AuthenticationException">TLS Error</exception>
|
||||
/// <exception cref="ConnectingFailedException">Based on RPC Exception</exception>
|
||||
///
|
||||
private async Task _ConnectAsync(TcpRpcClient rpcClient, ConnectionData connectionData)
|
||||
/// <exception cref="ConnectionException"></exception>
|
||||
private Stream InjectSSL(Stream tcpstream)
|
||||
{
|
||||
rpcClient.InjectMidlayer((tcpstream) =>
|
||||
{
|
||||
var sslStream = new SslStream(tcpstream, false, new RemoteCertificateValidationCallback(_RemoteCertificateValidationCallback));
|
||||
SslStream sslStream = new SslStream(tcpstream, false, new RemoteCertificateValidationCallback(_RemoteCertificateValidationCallback));
|
||||
try
|
||||
{
|
||||
sslStream.ReadTimeout = 5000;
|
||||
sslStream.AuthenticateAsClient("bffhd");
|
||||
sslStream.ReadTimeout = -1;
|
||||
|
||||
return sslStream;
|
||||
}
|
||||
catch (AuthenticationException)
|
||||
catch (System.Security.Authentication.AuthenticationException exception)
|
||||
{
|
||||
sslStream.Close();
|
||||
throw;
|
||||
Log.Warn(exception);
|
||||
throw new ConnectionException("TLS failed", exception);
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
catch(IOException exception)
|
||||
{
|
||||
Task timeoutTask = Task.Delay(3000);
|
||||
rpcClient.Connect(connectionData.Host.Host, connectionData.Host.Port);
|
||||
await await Task.WhenAny(rpcClient.WhenConnected, timeoutTask);
|
||||
|
||||
if(timeoutTask.IsCompleted)
|
||||
{
|
||||
throw new ConnectingFailedException("Connection timeout");
|
||||
}
|
||||
}
|
||||
catch (RpcException exception) when (string.Equals(exception.Message, "TcpRpcClient is unable to connect", StringComparison.Ordinal))
|
||||
{
|
||||
throw new ConnectingFailedException("RPC Connecting failed", exception);
|
||||
sslStream.Close();
|
||||
Log.Warn(exception);
|
||||
throw new ConnectionException("TLS failed", new Exceptions.TimeoutException("TLS timeout", exception));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create ConnectionInfo from Bootstrap
|
||||
/// Connect async to a server with ConnectionData
|
||||
/// </summary>
|
||||
private async Task<ConnectionInfo> _GetConnectionInfo(IBootstrap bootstrap)
|
||||
/// <exception cref="ConnectionException">Based on RPC Exception</exception>
|
||||
private async Task _ConnectAsync(TcpRpcClient tcprpcClient, ConnectionData connectionData)
|
||||
{
|
||||
ConnectionInfo connectionInfo = new ConnectionInfo()
|
||||
{
|
||||
APIVersion = await bootstrap.GetAPIVersion().ConfigureAwait(false),
|
||||
Mechanisms = new List<string>(await bootstrap.Mechanisms().ConfigureAwait(false)),
|
||||
ServerName = (await bootstrap.GetServerRelease().ConfigureAwait(false)).Item1,
|
||||
ServerRelease = (await bootstrap.GetServerRelease().ConfigureAwait(false)).Item2,
|
||||
};
|
||||
tcprpcClient.InjectMidlayer(InjectSSL);
|
||||
|
||||
return connectionInfo;
|
||||
try
|
||||
{
|
||||
Task timeoutTask = Task.Delay(5000);
|
||||
tcprpcClient.Connect(connectionData.Host.Host, connectionData.Host.Port);
|
||||
await await Task.WhenAny(tcprpcClient.WhenConnected, timeoutTask);
|
||||
|
||||
if (timeoutTask.IsCompleted)
|
||||
{
|
||||
Exceptions.TimeoutException timeoutException = new Exceptions.TimeoutException();
|
||||
Log.Warn(timeoutException);
|
||||
throw new ConnectionException("Connection timeout", timeoutException);
|
||||
}
|
||||
}
|
||||
catch (RpcException exception) when (string.Equals(exception.Message, "TcpRpcClient is unable to connect", StringComparison.Ordinal))
|
||||
{
|
||||
Log.Warn(exception);
|
||||
throw new ConnectionException("RPC Connecting failed", exception);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Authenticate connection with ConnectionData
|
||||
/// </summary>
|
||||
/// <exception cref="UnsupportedMechanismException"></exception>
|
||||
/// <exception cref="InvalidCredentialsException"></exception>
|
||||
/// <exception cref="AuthenticationFailedException"></exception>
|
||||
/// <param name="connectionData"> Data to establish a connection to a server </param>
|
||||
/// <exception cref="AuthenticationException"></exception>
|
||||
private async Task<Session> _Authenticate(ConnectionData connectionData)
|
||||
{
|
||||
IAuthentication? authentication = await _Bootstrap.CreateSession(MechanismString.ToString(connectionData.Mechanism)).ConfigureAwait(false);
|
||||
IAuthentication? authentication = await _Bootstrap.CreateSession(SASLMechanism.ToString(connectionData.Mechanism)).ConfigureAwait(false);
|
||||
|
||||
return await _SASLAuthenticate(authentication, MechanismString.ToString(connectionData.Mechanism), connectionData.Properties).ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
return await _SASLAuthenticate(authentication, SASLMechanism.ToString(connectionData.Mechanism), connectionData.Properties).ConfigureAwait(false);
|
||||
}
|
||||
catch (System.Exception exception)
|
||||
{
|
||||
Log.Warn(exception, "API authenticating failed");
|
||||
AuthenticationException authenticationException = new AuthenticationException("Authentication failed", exception);
|
||||
|
||||
throw authenticationException;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Authenticate Connection to get Session
|
||||
/// Authenticate with SASL
|
||||
/// </summary>
|
||||
/// <exception cref="BadMechanismException"></exception>
|
||||
/// <exception cref="InvalidCredentialsException"></exception>
|
||||
@ -331,6 +485,22 @@ namespace FabAccessAPI
|
||||
throw new AuthenticationFailedException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get ServerData from server with tcprpcconnection
|
||||
/// </summary>
|
||||
private async Task<ServerData> _GetServerData(IBootstrap bootstrap)
|
||||
{
|
||||
ServerData serverData = new ServerData()
|
||||
{
|
||||
APIVersion = await bootstrap.GetAPIVersion().ConfigureAwait(false),
|
||||
Mechanisms = new List<string>(await bootstrap.Mechanisms().ConfigureAwait(false)),
|
||||
ServerName = (await bootstrap.GetServerRelease().ConfigureAwait(false)).Item1,
|
||||
ServerRelease = (await bootstrap.GetServerRelease().ConfigureAwait(false)).Item2,
|
||||
};
|
||||
|
||||
return serverData;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -3,12 +3,18 @@ using System.Collections.Generic;
|
||||
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Data to establish a connection to a server
|
||||
/// With Data for Authentication
|
||||
/// </summary>
|
||||
public class ConnectionData
|
||||
{
|
||||
public Uri Host;
|
||||
public Mechanism Mechanism;
|
||||
public string Username;
|
||||
|
||||
public SASLMechanismEnum Mechanism;
|
||||
public Dictionary<string, object> Properties;
|
||||
|
||||
public DateTime LastTime;
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
|
@ -1,23 +0,0 @@
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
public enum ConnectionStatusChange
|
||||
{
|
||||
/// <summary>
|
||||
/// Client has established connection to server.
|
||||
/// </summary>
|
||||
Connected,
|
||||
/// <summary>
|
||||
/// Client has closed connection to server.
|
||||
/// </summary>
|
||||
Disconnected,
|
||||
/// <summary>
|
||||
/// Connection was lost and Client has reestablished connection to server.
|
||||
/// </summary>
|
||||
Reconnected,
|
||||
/// <summary>
|
||||
/// Connection was lost and can be reestablished with reconnect
|
||||
/// Connection should be closed if reconnecting fails.
|
||||
/// </summary>
|
||||
ConnectionLoss
|
||||
}
|
||||
}
|
20
FabAccessAPI/ConnectionStatusChanged.cs
Normal file
20
FabAccessAPI/ConnectionStatusChanged.cs
Normal file
@ -0,0 +1,20 @@
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
public enum ConnectionStatusChanged
|
||||
{
|
||||
/// <summary>
|
||||
/// API-Service has established connection to server
|
||||
/// </summary>
|
||||
Connected,
|
||||
|
||||
/// <summary>
|
||||
/// API-Service has closed the connection to a server
|
||||
/// </summary>
|
||||
Disconnected,
|
||||
|
||||
/// <summary>
|
||||
/// Connection was lost and the API-Service will try to reconnect automatically
|
||||
/// </summary>
|
||||
ConnectionLoss
|
||||
}
|
||||
}
|
26
FabAccessAPI/Exceptions/AuthenticationException.cs
Normal file
26
FabAccessAPI/Exceptions/AuthenticationException.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Authenticating to a server has failed
|
||||
/// InnerException will provide more information
|
||||
/// </summary>
|
||||
public class AuthenticationException : Exception
|
||||
{
|
||||
public AuthenticationException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public AuthenticationException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public AuthenticationException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
{
|
||||
public class ConnectingFailedException : Exception
|
||||
{
|
||||
public ConnectingFailedException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ConnectingFailedException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ConnectingFailedException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
26
FabAccessAPI/Exceptions/ConnectionException.cs
Normal file
26
FabAccessAPI/Exceptions/ConnectionException.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Connecting to a server has failed
|
||||
/// InnerException will provide more information
|
||||
/// </summary>
|
||||
public class ConnectionException : Exception
|
||||
{
|
||||
public ConnectionException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ConnectionException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ConnectionException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
namespace FabAccessAPI.Exceptions.SASL
|
||||
{
|
||||
public class AuthenticationFailedException : Exception
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
namespace FabAccessAPI.Exceptions.SASL
|
||||
{
|
||||
public class BadMechanismException : Exception
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
namespace FabAccessAPI.Exceptions.SASL
|
||||
{
|
||||
public class InvalidCredentialsException : Exception
|
||||
{
|
25
FabAccessAPI/Exceptions/TimeoutException.cs
Normal file
25
FabAccessAPI/Exceptions/TimeoutException.cs
Normal file
@ -0,0 +1,25 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI.Exceptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Timeout on Connection
|
||||
/// </summary>
|
||||
public class TimeoutException : Exception
|
||||
{
|
||||
public TimeoutException()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TimeoutException(string message) : base(message)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TimeoutException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -13,7 +13,7 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CapnpC.CSharp.MsBuild.Generation" Version="1.3.118" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="6.1.0" />
|
||||
<PackageReference Include="NLog" Version="5.0.0" />
|
||||
<PackageReference Include="NLog" Version="5.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -1,63 +1,84 @@
|
||||
using Capnp.Rpc;
|
||||
using FabAccessAPI.Schema;
|
||||
using System;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Capnp.Rpc;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Schema;
|
||||
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Service to connect to a server and maintain the connection
|
||||
/// </summary>
|
||||
public interface IAPI
|
||||
{
|
||||
#region Information about a connection and the server
|
||||
/// <summary>
|
||||
/// Data to establish connection.
|
||||
/// State of the conneciton, is the API-Service connecting to a server
|
||||
/// </summary>
|
||||
/// Without SecretProperties
|
||||
ConnectionData ConnectionData { get; }
|
||||
bool IsConnecting { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Information about the established connection.
|
||||
/// </summary>
|
||||
ConnectionInfo ConnectionInfo { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Is API connected?
|
||||
/// State of the conneciton, is the API-Service connected to a server
|
||||
/// </summary>
|
||||
bool IsConnected { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Get session when connection is established
|
||||
/// Information about the connection
|
||||
/// </summary>
|
||||
Session Session { get; }
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected or trying to connected to a server </exception>
|
||||
ConnectionData ConnectionData { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Event on changes in connection state.
|
||||
/// Information about the server
|
||||
/// Is only avalible if the API-Service is connected
|
||||
/// </summary>
|
||||
event EventHandler<ConnectionStatusChange> ConnectionStatusChanged;
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected </exception>
|
||||
ServerData ServerData { get; }
|
||||
#endregion
|
||||
|
||||
#region Methods to connect to server
|
||||
/// <summary>
|
||||
/// Unbind all Events from ConnectionStatus Change
|
||||
/// Connect to server with ConnectionData
|
||||
/// If connection lost, the API-Server will try to reconnect
|
||||
/// </summary>
|
||||
void UnbindAllEvents();
|
||||
|
||||
/// <summary>
|
||||
/// Connect to BFFH Server
|
||||
/// </summary>
|
||||
/// <param name="connectionData"></param>
|
||||
/// <param name="connectionData"> Data to establish a connection to a server </param>
|
||||
/// <exception cref="ConnectionException"> When API-Service can not connect to a server </exception>
|
||||
/// <exception cref="AuthenticationException"> When API-Service can connect to a server but can not authenticate </exception>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is allready connected </exception>
|
||||
Task Connect(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null);
|
||||
|
||||
/// <summary>
|
||||
/// Disconnect from BFFH Server
|
||||
/// Disconnect from a server
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected or trying to connect </exception>
|
||||
Task Disconnect();
|
||||
|
||||
/// <summary>
|
||||
/// Reconnect after connection loss with the last ConnectionData
|
||||
/// Try to connect to a server and get ServerData
|
||||
/// The connection is not maintained
|
||||
/// </summary>
|
||||
Task Reconnect();
|
||||
/// <exception cref="ConnectionException"> When API-Service can not connect to a server </exception>
|
||||
Task<ServerData> TryToConnect(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null);
|
||||
#endregion
|
||||
|
||||
#region Session
|
||||
/// <summary>
|
||||
/// Get session after connection
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException"> When API-Service is not connected </exception>
|
||||
Session Session { get; }
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
/// <summary>
|
||||
/// Event on changes in connection status
|
||||
/// </summary>
|
||||
event EventHandler<ConnectionStatusChanged> ConnectionStatusChanged;
|
||||
|
||||
/// <summary>
|
||||
/// Connect to Server and get ConnectionInfo.
|
||||
/// The Connection is not maintained.
|
||||
/// Unbind all handlers from EventHandler<ConnectionStatusChanged>
|
||||
/// </summary>
|
||||
Task<ConnectionInfo> TestConnection(ConnectionData connectionData, TcpRpcClient tcpRpcClient = null);
|
||||
void UnbindEventHandler();
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -1,24 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
public enum Mechanism
|
||||
{
|
||||
PLAIN,
|
||||
}
|
||||
|
||||
public static class MechanismString
|
||||
{
|
||||
public static string ToString(Mechanism mechanism)
|
||||
{
|
||||
switch(mechanism)
|
||||
{
|
||||
case Mechanism.PLAIN:
|
||||
return "PLAIN";
|
||||
default:
|
||||
throw new ArgumentException("Mechanism not known.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
24
FabAccessAPI/SASLMechanismEnum.cs
Normal file
24
FabAccessAPI/SASLMechanismEnum.cs
Normal file
@ -0,0 +1,24 @@
|
||||
using System;
|
||||
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
public enum SASLMechanismEnum
|
||||
{
|
||||
PLAIN,
|
||||
}
|
||||
|
||||
public static class SASLMechanism
|
||||
{
|
||||
public static string ToString(SASLMechanismEnum mechanism)
|
||||
{
|
||||
switch(mechanism)
|
||||
{
|
||||
case SASLMechanismEnum.PLAIN:
|
||||
return "PLAIN";
|
||||
default:
|
||||
throw new ArgumentException("Mechanism unknown.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
|
||||
namespace FabAccessAPI
|
||||
{
|
||||
public class ConnectionInfo
|
||||
public class ServerData
|
||||
{
|
||||
public Schema.Version APIVersion;
|
||||
public string ServerName;
|
@ -1 +1 @@
|
||||
Subproject commit 19f20f5154f0eced6288ff56cac840025ee51da1
|
||||
Subproject commit cde4677575f8e133ac764663e131c80fc891d545
|
@ -1,6 +1,7 @@
|
||||
using Capnp.Rpc;
|
||||
using FabAccessAPI;
|
||||
using FabAccessAPI.Exceptions;
|
||||
using FabAccessAPI.Exceptions.SASL;
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -19,7 +20,7 @@ namespace FabAccessAPI_Test
|
||||
ConnectionData connectionData = new ConnectionData()
|
||||
{
|
||||
Host = new UriBuilder(TestEnv.SCHEMA, "UnkownHost" + TestEnv.TESTSERVER, TestEnv.TESTSERVER_PORT).Uri,
|
||||
Mechanism = Mechanism.PLAIN,
|
||||
Mechanism = SASLMechanismEnum.PLAIN,
|
||||
Username = "UnkownUser",
|
||||
Properties = new Dictionary<string, object>()
|
||||
{
|
||||
@ -32,14 +33,14 @@ namespace FabAccessAPI_Test
|
||||
{
|
||||
await api.Connect(connectionData);
|
||||
}
|
||||
catch (ConnectingFailedException)
|
||||
catch (ConnectionException)
|
||||
{
|
||||
Assert.Pass();
|
||||
}
|
||||
Assert.Fail();
|
||||
}
|
||||
|
||||
[Test, Ignore("")]
|
||||
[Test]
|
||||
public async Task Connect_InvalidCredentials()
|
||||
{
|
||||
API api = new API();
|
||||
@ -50,7 +51,7 @@ namespace FabAccessAPI_Test
|
||||
{
|
||||
await api.Connect(connectionData);
|
||||
}
|
||||
catch(InvalidCredentialsException)
|
||||
catch(AuthenticationException exception) when (exception.InnerException is InvalidCredentialsException)
|
||||
{
|
||||
Assert.Pass();
|
||||
}
|
||||
@ -68,11 +69,11 @@ namespace FabAccessAPI_Test
|
||||
bool event_Disconnected = false;
|
||||
api.ConnectionStatusChanged += (sender, eventArgs) =>
|
||||
{
|
||||
if (eventArgs == ConnectionStatusChange.Connected)
|
||||
if (eventArgs == ConnectionStatusChanged.Connected)
|
||||
{
|
||||
event_Connected = true;
|
||||
}
|
||||
if(eventArgs == ConnectionStatusChange.Disconnected)
|
||||
if(eventArgs == ConnectionStatusChanged.Disconnected)
|
||||
{
|
||||
event_Disconnected = true;
|
||||
}
|
||||
@ -82,7 +83,7 @@ namespace FabAccessAPI_Test
|
||||
|
||||
bool HasSesion = api.Session != null;
|
||||
bool HasConnectionData = api.ConnectionData != null;
|
||||
bool HasConnectionInfo = api.ConnectionInfo != null;
|
||||
bool HasServerData = api.ServerData != null;
|
||||
bool IsConnected = api.IsConnected;
|
||||
|
||||
await api.Disconnect();
|
||||
@ -95,7 +96,7 @@ namespace FabAccessAPI_Test
|
||||
|
||||
Assert.IsTrue(HasSesion, "HasSesion");
|
||||
Assert.IsTrue(HasConnectionData, "HasConnectionData");
|
||||
Assert.IsTrue(HasConnectionInfo, "HasConnectionInfo");
|
||||
Assert.IsTrue(HasServerData, "HasServerData");
|
||||
Assert.IsTrue(IsConnected, "IsConnected");
|
||||
|
||||
Assert.IsFalse(api.IsConnected, "api.IsConnected");
|
||||
@ -109,9 +110,9 @@ namespace FabAccessAPI_Test
|
||||
|
||||
ConnectionData connectionData = TestEnv.CreateConnetionData(username);
|
||||
|
||||
ConnectionInfo connectionInfo = await api.TestConnection(connectionData);
|
||||
ServerData serverData = await api.TryToConnect(connectionData);
|
||||
|
||||
Assert.IsNotNull(connectionInfo);
|
||||
Assert.IsNotNull(serverData);
|
||||
}
|
||||
|
||||
[TestCase("Admin1"), Explicit]
|
||||
@ -121,28 +122,23 @@ namespace FabAccessAPI_Test
|
||||
|
||||
ConnectionData connectionData = TestEnv.CreateConnetionData(username);
|
||||
|
||||
bool event_Connected = false;
|
||||
bool event_ConnectionLoss = false;
|
||||
bool event_Reconnect = false;
|
||||
bool event_Disconnected = false;
|
||||
int event_Connected = 0;
|
||||
int event_ConnectionLoss = 0;
|
||||
int event_Disconnected = 0;
|
||||
|
||||
api.ConnectionStatusChanged += (sender, eventArgs) =>
|
||||
{
|
||||
if (eventArgs == ConnectionStatusChange.Connected)
|
||||
if (eventArgs == ConnectionStatusChanged.Connected)
|
||||
{
|
||||
event_Connected = true;
|
||||
event_Connected++;
|
||||
}
|
||||
if (eventArgs == ConnectionStatusChange.ConnectionLoss)
|
||||
if (eventArgs == ConnectionStatusChanged.ConnectionLoss)
|
||||
{
|
||||
event_ConnectionLoss = true;
|
||||
event_ConnectionLoss++;
|
||||
}
|
||||
if (eventArgs == ConnectionStatusChange.Reconnected)
|
||||
if (eventArgs == ConnectionStatusChanged.Disconnected)
|
||||
{
|
||||
event_Reconnect = true;
|
||||
}
|
||||
if (eventArgs == ConnectionStatusChange.Disconnected)
|
||||
{
|
||||
event_Disconnected = true;
|
||||
event_Disconnected++;
|
||||
}
|
||||
};
|
||||
|
||||
@ -161,16 +157,14 @@ namespace FabAccessAPI_Test
|
||||
Thread.Sleep(3000);
|
||||
|
||||
// Stop here and connect with internet again
|
||||
await api.Reconnect();
|
||||
await api.Disconnect();
|
||||
|
||||
Thread.Sleep(3000);
|
||||
Thread.Sleep(1000);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.IsTrue(event_Connected, "event_Connected");
|
||||
Assert.IsTrue(event_ConnectionLoss, "event_ConnectionLoss");
|
||||
Assert.IsTrue(event_Reconnect, "event_Reconnect");
|
||||
Assert.IsTrue(event_Disconnected, "event_Disconnected");
|
||||
Assert.AreEqual(2, event_Connected, "event_Connected");
|
||||
Assert.AreEqual(1, event_ConnectionLoss, "event_ConnectionLoss");
|
||||
Assert.AreEqual(1, event_Disconnected, "event_Disconnected");
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@ namespace FabAccessAPI_Test.API_TestEnv
|
||||
|
||||
[TestCase("Admin1", "NewMakerA1", "UseA", "ReadA", "DiscloseA")]
|
||||
[Order(1)]
|
||||
[Ignore("Deprecated")]
|
||||
public async Task AddRoles(string username, string username2, params string[] roles)
|
||||
{
|
||||
API api = new API();
|
||||
|
@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
@ -9,8 +9,8 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="6.1.0" />
|
||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.3.1" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@ -1,4 +1,5 @@
|
||||
using FabAccessAPI;
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
@ -7,16 +8,17 @@ namespace FabAccessAPI_Test
|
||||
public static class TestEnv
|
||||
{
|
||||
public const string SCHEMA = "fabaccess";
|
||||
public const string TESTSERVER = "127.0.0.1";//"bffh.lab.bln.kjknet.de";
|
||||
public const int TESTSERVER_PORT = 59666;
|
||||
public const string TESTSERVER = "127.0.0.1";//"test.fab-access.org";
|
||||
public const int TESTSERVER_PORT = 59661;
|
||||
public const string PASSWORD = "secret";
|
||||
|
||||
[TestCase("Testuser")]
|
||||
public static ConnectionData CreateConnetionData(string username)
|
||||
{
|
||||
ConnectionData connectionData = new ConnectionData()
|
||||
{
|
||||
Host = new UriBuilder(TestEnv.SCHEMA, TestEnv.TESTSERVER, TestEnv.TESTSERVER_PORT).Uri,
|
||||
Mechanism = Mechanism.PLAIN,
|
||||
Mechanism = SASLMechanismEnum.PLAIN,
|
||||
Username = username,
|
||||
Properties = new Dictionary<string, object>()
|
||||
{
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user