├── .gitattributes
├── .gitignore
├── Android
├── .gitignore
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── ptolkachev
│ │ │ └── androidscanner
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── ptolkachev
│ │ │ └── androidscanner
│ │ │ └── Scanner.java
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── ptolkachev
│ │ └── androidscanner
│ │ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
├── Config
├── INFO.XML
└── MANIFEST.XML
├── LICENSE
├── Native
├── AddInNative.cpp
├── AddInNative.h
├── AndroidScanner.cpp
├── AndroidScanner.h
├── ConversionWchar.cpp
├── ConversionWchar.h
├── ScannerDriver.cpp
├── ScannerDriver.h
├── ScannerDriver.sln
├── ScannerDriver.vcxproj
├── ScannerDriver.vcxproj.filters
├── include
│ ├── AddInDefBase.h
│ ├── ComponentBase.h
│ ├── IAndroidComponentHelper.h
│ ├── IMemoryManager.h
│ ├── addinlib.h
│ ├── com.h
│ ├── mobile.h
│ └── types.h
├── jni
│ ├── jnienv.cpp
│ └── jnienv.h
└── pch.h
├── README.md
└── ScannerLibMA
├── CommonCommands
├── НастройкаСканераШтрихкодовAndroid.xml
└── НастройкаСканераШтрихкодовAndroid
│ └── Ext
│ └── CommandModule.bsl
├── CommonForms
├── НастройкаДрайвераСканераШтрихкодовAndroid.xml
└── НастройкаДрайвераСканераШтрихкодовAndroid
│ └── Ext
│ ├── Form.xml
│ └── Form
│ └── Module.bsl
├── CommonModules
├── МенеджерСканераШтрихкодовAndroidВызовСервера.xml
├── МенеджерСканераШтрихкодовAndroidВызовСервера
│ └── Ext
│ │ └── Module.bsl
├── МенеджерСканераШтрихкодовAndroidКлиент.xml
└── МенеджерСканераШтрихкодовAndroidКлиент
│ └── Ext
│ └── Module.bsl
├── CommonTemplates
├── ДрайверСканераШтрихкодовAndroid.xml
└── ДрайверСканераШтрихкодовAndroid
│ └── Ext
│ └── Template.bin
├── ConfigDumpInfo.xml
├── Configuration.xml
├── Constants
├── ДрайверСканераШтрихкодовAndroidУстановлен.xml
├── ИспользоватьСканерШтрихкодовAndroid.xml
└── ПараметрыСканераШтрихкодовAndroid.xml
├── Ext
└── ManagedApplicationModule.bsl
├── Languages
└── Русский.xml
└── Subsystems
└── СканерШтрихкодовAndroid.xml
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | bld/
21 | [Bb]in/
22 | [Oo]bj/
23 | [Ll]og/
24 | [Aa][Rr][Mm]/
25 |
26 | # Visual Studio 2015 cache/options directory
27 | .vs/
28 | # Uncomment if you have tasks that create the project's static files in wwwroot
29 | #wwwroot/
30 |
31 | # MSTest test Results
32 | [Tt]est[Rr]esult*/
33 | [Bb]uild[Ll]og.*
34 |
35 | # NUNIT
36 | *.VisualState.xml
37 | TestResult.xml
38 |
39 | # Build Results of an ATL Project
40 | [Dd]ebugPS/
41 | [Rr]eleasePS/
42 | dlldata.c
43 |
44 | # DNX
45 | project.lock.json
46 | project.fragment.lock.json
47 | artifacts/
48 |
49 | *_i.c
50 | *_p.c
51 | *_i.h
52 | *.ilk
53 | *.meta
54 | *.obj
55 | *.pch
56 | *.pdb
57 | *.pgc
58 | *.pgd
59 | *.rsp
60 | *.sbr
61 | *.tlb
62 | *.tli
63 | *.tlh
64 | *.tmp
65 | *.tmp_proj
66 | *.log
67 | *.vspscc
68 | *.vssscc
69 | .builds
70 | *.pidb
71 | *.svclog
72 | *.scc
73 |
74 | # Chutzpah Test files
75 | _Chutzpah*
76 |
77 | # Visual C++ cache files
78 | ipch/
79 | *.aps
80 | *.ncb
81 | *.opendb
82 | *.opensdf
83 | *.sdf
84 | *.cachefile
85 | *.VC.db
86 | *.VC.VC.opendb
87 |
88 | # Visual Studio profiler
89 | *.psess
90 | *.vsp
91 | *.vspx
92 | *.sap
93 |
94 | # TFS 2012 Local Workspace
95 | $tf/
96 |
97 | # Guidance Automation Toolkit
98 | *.gpState
99 |
100 | # ReSharper is a .NET coding add-in
101 | _ReSharper*/
102 | *.[Rr]e[Ss]harper
103 | *.DotSettings.user
104 |
105 | # JustCode is a .NET coding add-in
106 | .JustCode
107 |
108 | # TeamCity is a build add-in
109 | _TeamCity*
110 |
111 | # DotCover is a Code Coverage Tool
112 | *.dotCover
113 |
114 | # NCrunch
115 | _NCrunch_*
116 | .*crunch*.local.xml
117 | nCrunchTemp_*
118 |
119 | # MightyMoose
120 | *.mm.*
121 | AutoTest.Net/
122 |
123 | # Web workbench (sass)
124 | .sass-cache/
125 |
126 | # Installshield output folder
127 | [Ee]xpress/
128 |
129 | # DocProject is a documentation generator add-in
130 | DocProject/buildhelp/
131 | DocProject/Help/*.HxT
132 | DocProject/Help/*.HxC
133 | DocProject/Help/*.hhc
134 | DocProject/Help/*.hhk
135 | DocProject/Help/*.hhp
136 | DocProject/Help/Html2
137 | DocProject/Help/html
138 |
139 | # Click-Once directory
140 | publish/
141 |
142 | # Publish Web Output
143 | *.[Pp]ublish.xml
144 | *.azurePubxml
145 | # TODO: Comment the next line if you want to checkin your web deploy settings
146 | # but database connection strings (with potential passwords) will be unencrypted
147 | #*.pubxml
148 | *.publishproj
149 |
150 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
151 | # checkin your Azure Web App publish settings, but sensitive information contained
152 | # in these scripts will be unencrypted
153 | PublishScripts/
154 |
155 | # NuGet Packages
156 | *.nupkg
157 | # The packages folder can be ignored because of Package Restore
158 | **/packages/*
159 | # except build/, which is used as an MSBuild target.
160 | !**/packages/build/
161 | # Uncomment if necessary however generally it will be regenerated when needed
162 | #!**/packages/repositories.config
163 | # NuGet v3's project.json files produces more ignoreable files
164 | *.nuget.props
165 | *.nuget.targets
166 |
167 | # Microsoft Azure Build Output
168 | csx/
169 | *.build.csdef
170 |
171 | # Microsoft Azure Emulator
172 | ecf/
173 | rcf/
174 |
175 | # Windows Store app package directories and files
176 | AppPackages/
177 | BundleArtifacts/
178 | Package.StoreAssociation.xml
179 | _pkginfo.txt
180 |
181 | # Visual Studio cache files
182 | # files ending in .cache can be ignored
183 | *.[Cc]ache
184 | # but keep track of directories ending in .cache
185 | !*.[Cc]ache/
186 |
187 | # Others
188 | ClientBin/
189 | ~$*
190 | *~
191 | *.dbmdl
192 | *.dbproj.schemaview
193 | *.jfm
194 | *.pfx
195 | *.publishsettings
196 | node_modules/
197 | orleans.codegen.cs
198 |
199 | # Since there are multiple workflows, uncomment next line to ignore bower_components
200 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
201 | #bower_components/
202 |
203 | # RIA/Silverlight projects
204 | Generated_Code/
205 |
206 | # Backup & report files from converting an old project file
207 | # to a newer Visual Studio version. Backup files are not needed,
208 | # because we have git ;-)
209 | _UpgradeReport_Files/
210 | Backup*/
211 | UpgradeLog*.XML
212 | UpgradeLog*.htm
213 |
214 | # SQL Server files
215 | *.mdf
216 | *.ldf
217 |
218 | # Business Intelligence projects
219 | *.rdl.data
220 | *.bim.layout
221 | *.bim_*.settings
222 |
223 | # Microsoft Fakes
224 | FakesAssemblies/
225 |
226 | # GhostDoc plugin setting file
227 | *.GhostDoc.xml
228 |
229 | # Node.js Tools for Visual Studio
230 | .ntvs_analysis.dat
231 |
232 | # Visual Studio 6 build log
233 | *.plg
234 |
235 | # Visual Studio 6 workspace options file
236 | *.opt
237 |
238 | # Visual Studio LightSwitch build output
239 | **/*.HTMLClient/GeneratedArtifacts
240 | **/*.DesktopClient/GeneratedArtifacts
241 | **/*.DesktopClient/ModelManifest.xml
242 | **/*.Server/GeneratedArtifacts
243 | **/*.Server/ModelManifest.xml
244 | _Pvt_Extensions
245 |
246 | # Paket dependency manager
247 | .paket/paket.exe
248 | paket-files/
249 |
250 | # FAKE - F# Make
251 | .fake/
252 |
253 | # JetBrains Rider
254 | .idea/
255 | *.sln.iml
256 |
257 | # CodeRush
258 | .cr/
259 |
260 | # Python Tools for Visual Studio (PTVS)
261 | __pycache__/
262 | *.pyc
263 |
264 | #Android Studio
265 | *.iml
266 | .gradle
267 | /local.properties
268 | /.idea/caches
269 | /.idea/libraries
270 | /.idea/modules.xml
271 | /.idea/workspace.xml
272 | /.idea/navEditor.xml
273 | /.idea/assetWizardSettings.xml
274 | .DS_Store
275 | /build
276 | /captures
277 | .externalNativeBuild
278 | .cxx
279 |
280 | #Other
281 | [Pp]ackage/
--------------------------------------------------------------------------------
/Android/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /captures
13 | .externalNativeBuild
14 | .cxx
15 |
--------------------------------------------------------------------------------
/Android/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/Android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 30
5 | buildToolsVersion "30.0.2"
6 |
7 | defaultConfig {
8 | applicationId "com.ptolkachev.androidscanner"
9 | minSdkVersion 19
10 | targetSdkVersion 30
11 | versionCode 2
12 | versionName "1.1"
13 |
14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
15 | }
16 |
17 | buildTypes {
18 | release {
19 | minifyEnabled false
20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
21 | }
22 | }
23 | }
24 |
25 | dependencies {
26 | implementation fileTree(dir: "libs", include: ["*.jar"])
27 | implementation 'androidx.appcompat:appcompat:1.2.0'
28 | testImplementation 'junit:junit:4.13.2'
29 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
30 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
31 |
32 | }
--------------------------------------------------------------------------------
/Android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/Android/app/src/androidTest/java/com/ptolkachev/androidscanner/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.ptolkachev.androidscanner;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 | assertEquals("com.ptolkachev.androidscanner", appContext.getPackageName());
25 | }
26 | }
--------------------------------------------------------------------------------
/Android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Android/app/src/main/java/com/ptolkachev/androidscanner/Scanner.java:
--------------------------------------------------------------------------------
1 | package com.ptolkachev.androidscanner;
2 |
3 | import android.app.Activity;
4 | import android.content.BroadcastReceiver;
5 | import android.content.ClipData;
6 | import android.content.ClipboardManager;
7 | import android.content.Context;
8 | import android.content.Intent;
9 | import android.content.IntentFilter;
10 |
11 | public class Scanner implements Runnable, ClipboardManager.OnPrimaryClipChangedListener {
12 | // in C/C++ code the function will have name
13 | // Java_com_ptolkachev_androidscanner_Scanner_OnBarcodeReceived
14 | static native void OnBarcodeReceived(long pObject, String barcode);
15 |
16 | Activity mActivity;
17 | long mCallObject;
18 |
19 | String mScanMode;
20 | String mExtraData;
21 | BroadcastReceiver mReceiver;
22 |
23 | public Scanner(Activity activity, long pObject) {
24 | mActivity = activity;
25 | mCallObject = pObject;
26 | mReceiver = null;
27 | mScanMode = "broadcast";
28 | }
29 |
30 | public void show()
31 | {
32 | mActivity.runOnUiThread(this);
33 | }
34 |
35 | @Override
36 | public void run() {
37 | System.loadLibrary("com_ptolkachev_AndroidScanner");
38 | }
39 |
40 | public void start(String scanMode, String actionName, String extraData) {
41 | if (mReceiver != null) {
42 | return;
43 | }
44 |
45 | mScanMode = scanMode;
46 |
47 | if (mScanMode.equals("clipboard")) {
48 | ClipboardManager clipboardManager = getClipboardManager();
49 | if (clipboardManager != null) {
50 | clipboardManager.addPrimaryClipChangedListener(this);
51 | }
52 | } else {
53 | mExtraData = extraData;
54 |
55 | mReceiver = new BroadcastReceiver() {
56 | @Override
57 | public void onReceive(Context context, Intent intent) {
58 | if (intent != null && intent.hasExtra(mExtraData)) {
59 | String barCode = intent.getStringExtra(mExtraData);
60 | if (barCode != null && !barCode.isEmpty()) {
61 | OnBarcodeReceived(mCallObject, barCode);
62 | }
63 | }
64 | }
65 | };
66 |
67 | IntentFilter filter = new IntentFilter(actionName);
68 | mActivity.registerReceiver(mReceiver, filter);
69 | }
70 | }
71 |
72 | public void stop() {
73 | if (mReceiver != null) {
74 | mActivity.unregisterReceiver(mReceiver);
75 | mReceiver = null;
76 | }
77 | if (mScanMode.equals("clipboard")) {
78 | ClipboardManager clipboardManager = getClipboardManager();
79 | if (clipboardManager != null) {
80 | clipboardManager.removePrimaryClipChangedListener(this);
81 | }
82 | }
83 | }
84 |
85 | @Override
86 | public void onPrimaryClipChanged() {
87 | ClipboardManager clipboardManager = getClipboardManager();
88 | if (clipboardManager != null) {
89 | ClipData clipData = clipboardManager.getPrimaryClip();
90 | if (clipData != null) {
91 | ClipData.Item item = clipData.getItemAt(0);
92 | String barCode = item.getText().toString();
93 | if (!barCode.isEmpty()) {
94 | OnBarcodeReceived(mCallObject, barCode);
95 | }
96 | }
97 | }
98 | }
99 |
100 | private ClipboardManager getClipboardManager() {
101 | return (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
102 | }
103 | }
--------------------------------------------------------------------------------
/Android/app/src/test/java/com/ptolkachev/androidscanner/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.ptolkachev.androidscanner;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/Android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | buildscript {
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:4.2.0'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | mavenCentral()
19 | }
20 | }
21 |
22 | task clean(type: Delete) {
23 | delete rootProject.buildDir
24 | }
--------------------------------------------------------------------------------
/Android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
--------------------------------------------------------------------------------
/Android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ltfriend/AndroidScannerDriverFor1C/5ec417a11cefdcb1e8aa24460d8b3d4b4965ed76/Android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/Android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Sep 27 21:54:50 MSK 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
7 |
--------------------------------------------------------------------------------
/Android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn () {
37 | echo "$*"
38 | }
39 |
40 | die () {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Escape application args
158 | save () {
159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 | echo " "
161 | }
162 | APP_ARGS=$(save "$@")
163 |
164 | # Collect all arguments for the java command, following the shell quoting and substitution rules
165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 |
167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 | cd "$(dirname "$0")"
170 | fi
171 |
172 | exec "$JAVACMD" "$@"
173 |
--------------------------------------------------------------------------------
/Android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/Android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 | rootProject.name = "androidscanner"
--------------------------------------------------------------------------------
/Config/INFO.XML:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Config/MANIFEST.XML:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
--------------------------------------------------------------------------------
/Native/AddInNative.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "AddInNative.h"
3 | #include "ConversionWchar.h"
4 | #include
5 | #include
6 |
7 | static const wchar_t* g_MethodNames[] =
8 | {
9 | L"GetInterfaceRevision",
10 | L"GetDescription",
11 | L"GetLastError",
12 | L"GetParameters",
13 | L"SetParameter",
14 | L"Open",
15 | L"Close",
16 | L"DeviceTest",
17 | L"GetAdditionalActions",
18 | L"DoAdditionalAction"
19 | };
20 |
21 | static const wchar_t* g_MethodNamesRu[] =
22 | {
23 | L"ПолучитьРевизиюИнтерфейса",
24 | L"ПолучитьОписание",
25 | L"ПолучитьОшибку",
26 | L"ПолучитьПараметры",
27 | L"УстановитьПараметр",
28 | L"Подключить",
29 | L"Отключить",
30 | L"ТестУстройства",
31 | L"ПолучитьДополнительныеДействия",
32 | L"ВыполнитьДополнительноеДействие"
33 | };
34 |
35 | static const wchar_t g_ComponentNameType[] = L"com_ptolkachev_AndroidScannerExtension";
36 | static const wchar_t g_kClassNames[] = L"AndroidScanner";
37 | static WcharWrapper s_kClassNames(g_kClassNames);
38 |
39 | const long g_VersionAddIn = 1000;
40 | const long g_InterfaceRev = 3003; // Version 3.3
41 |
42 | static AppCapabilities g_capabilities = eAppCapabilitiesInvalid;
43 |
44 | //---------------------------------------------------------------------------//
45 | long GetClassObject(const WCHAR_T* wsName, IComponentBase** pInterface)
46 | {
47 | if(!*pInterface)
48 | {
49 | *pInterface = new AddInNative();
50 | return (long)*pInterface;
51 | }
52 | return 0;
53 | }
54 |
55 | //---------------------------------------------------------------------------//
56 | AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities)
57 | {
58 | g_capabilities = capabilities;
59 | return eAppCapabilitiesLast;
60 | }
61 |
62 | //---------------------------------------------------------------------------//
63 | long DestroyObject(IComponentBase** pInterface)
64 | {
65 | if(!*pInterface)
66 | return -1;
67 |
68 | delete *pInterface;
69 | *pInterface = 0;
70 | return 0;
71 | }
72 |
73 | //---------------------------------------------------------------------------//
74 | const WCHAR_T* GetClassNames()
75 | {
76 | return s_kClassNames;
77 | }
78 |
79 | //---------------------------------------------------------------------------//
80 | // AddInNative
81 | AddInNative::AddInNative() : m_iConnect(0), m_iMemory(0)
82 | {
83 | }
84 | //---------------------------------------------------------------------------//
85 | AddInNative::~AddInNative()
86 | {
87 | }
88 | //---------------------------------------------------------------------------//
89 | bool AddInNative::Init(void* pConnection)
90 | {
91 | m_iConnect = (IAddInDefBaseEx*)pConnection;
92 |
93 | if (m_iConnect)
94 | m_Scanner.SetIConnect(m_iConnect);
95 |
96 | return m_iConnect != nullptr;
97 | }
98 | //---------------------------------------------------------------------------//
99 | long AddInNative::GetInfo()
100 | {
101 | return g_VersionAddIn;
102 | }
103 | //---------------------------------------------------------------------------//
104 | void AddInNative::Done()
105 | {
106 | m_iConnect = nullptr;
107 | m_iMemory = nullptr;
108 | }
109 | //---------------------------------------------------------------------------//
110 | bool AddInNative::RegisterExtensionAs(WCHAR_T** wsExtensionName)
111 | {
112 | const wchar_t* wsExtension = g_ComponentNameType;
113 | uint32_t iActualSize = static_cast(::wcslen(wsExtension) + 1);
114 |
115 | if (m_iMemory)
116 | {
117 | if (m_iMemory->AllocMemory((void**)wsExtensionName, iActualSize * sizeof(WCHAR_T)))
118 | {
119 | convToShortWchar(wsExtensionName, wsExtension, iActualSize);
120 | return true;
121 | }
122 | }
123 |
124 | return false;
125 | }
126 | //---------------------------------------------------------------------------//
127 | long AddInNative::GetNProps()
128 | {
129 | return eLastProp;
130 | }
131 | //---------------------------------------------------------------------------//
132 | long AddInNative::FindProp(const WCHAR_T* wsPropName)
133 | {
134 | return -1;
135 | }
136 | //---------------------------------------------------------------------------//
137 | const WCHAR_T* AddInNative::GetPropName(long lPropNum, long lPropAlias)
138 | {
139 | return NULL;
140 | }
141 | //---------------------------------------------------------------------------//
142 | bool AddInNative::GetPropVal(const long lPropNum, tVariant* pvarPropVal)
143 | {
144 | return false;
145 | }
146 | //---------------------------------------------------------------------------//
147 | bool AddInNative::SetPropVal(const long lPropNum, tVariant* varPropVal)
148 | {
149 | return false;
150 | }
151 | //---------------------------------------------------------------------------//
152 | bool AddInNative::IsPropReadable(const long lPropNum)
153 | {
154 | return true;
155 | }
156 | //---------------------------------------------------------------------------//
157 | bool AddInNative::IsPropWritable(const long lPropNum)
158 | {
159 | return false;
160 | }
161 | //---------------------------------------------------------------------------//
162 | long AddInNative::GetNMethods()
163 | {
164 | return eLastMethod;
165 | }
166 | //---------------------------------------------------------------------------//
167 | long AddInNative::FindMethod(const WCHAR_T* wsMethodName)
168 | {
169 | long plMethodNum = -1;
170 | wchar_t* name = 0;
171 | convFromShortWchar(&name, wsMethodName);
172 |
173 | plMethodNum = findName(g_MethodNames, name, eLastMethod);
174 |
175 | if (plMethodNum == -1)
176 | plMethodNum = findName(g_MethodNamesRu, name, eLastMethod);
177 |
178 | delete[] name;
179 |
180 | return plMethodNum;
181 | }
182 | //---------------------------------------------------------------------------//
183 | const WCHAR_T* AddInNative::GetMethodName(const long lMethodNum,
184 | const long lMethodAlias)
185 | {
186 | if (lMethodNum >= eLastMethod)
187 | return NULL;
188 |
189 | wchar_t* wsCurrentName = NULL;
190 | WCHAR_T* wsMethodName = NULL;
191 |
192 | switch (lMethodAlias)
193 | {
194 | case 0: // First language (english)
195 | wsCurrentName = (wchar_t*)g_MethodNames[lMethodNum];
196 | break;
197 | case 1: // Second language (local)
198 | wsCurrentName = (wchar_t*)g_MethodNamesRu[lMethodNum];
199 | break;
200 | default:
201 | return 0;
202 | }
203 |
204 | uint32_t iActualSize = static_cast(wcslen(wsCurrentName) + 1);
205 |
206 | if (m_iMemory && wsCurrentName)
207 | {
208 | if (m_iMemory->AllocMemory((void**)&wsMethodName, iActualSize * sizeof(WCHAR_T)))
209 | convToShortWchar(&wsMethodName, wsCurrentName, iActualSize);
210 | }
211 |
212 | return wsMethodName;
213 | }
214 | //---------------------------------------------------------------------------//
215 | long AddInNative::GetNParams(const long lMethodNum)
216 | {
217 | switch (lMethodNum)
218 | {
219 | case eMethGetDescription:
220 | case eMethGetLastError:
221 | case eMethGetParameters:
222 | case eMethOpen:
223 | case eMethClose:
224 | case eMethGetAdditionalActions:
225 | case eMethDoAdditionalAction:
226 | return 1;
227 | case eMethSetParameter:
228 | case eMethDeviceTest:
229 | return 2;
230 | default:
231 | return 0;
232 | }
233 | }
234 | //---------------------------------------------------------------------------//
235 | bool AddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum,
236 | tVariant *pvarParamDefValue)
237 | {
238 | TV_VT(pvarParamDefValue) = VTYPE_EMPTY;
239 | return false;
240 | }
241 | //---------------------------------------------------------------------------//
242 | bool AddInNative::HasRetVal(const long lMethodNum)
243 | {
244 | switch (lMethodNum)
245 | {
246 | case eMethGetInterfaceRevision:
247 | case eMethGetDescription:
248 | case eMethGetLastError:
249 | case eMethGetParameters:
250 | case eMethSetParameter:
251 | case eMethOpen:
252 | case eMethClose:
253 | case eMethDeviceTest:
254 | case eMethGetAdditionalActions:
255 | case eMethDoAdditionalAction:
256 | return true;
257 | default:
258 | return false;
259 | }
260 | }
261 | //---------------------------------------------------------------------------//
262 | bool AddInNative::CallAsProc(const long lMethodNum,
263 | tVariant* paParams, const long lSizeArray)
264 | {
265 | return false;
266 | }
267 | //---------------------------------------------------------------------------//
268 | bool AddInNative::CallAsFunc(const long lMethodNum,
269 | tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray)
270 | {
271 | switch (lMethodNum)
272 | {
273 | case eMethGetInterfaceRevision:
274 | TV_VT(pvarRetValue) = VTYPE_I4;
275 | TV_I4(pvarRetValue) = static_cast(g_InterfaceRev);
276 | return true;
277 | case eMethGetDescription:
278 | if (m_iMemory)
279 | {
280 | WCHAR_T* pwstrDesc = m_Scanner.GetDescription();
281 | uint32_t iActualSize = getLenShortWcharStr(pwstrDesc) + 1;
282 | tVariant& pParam0 = paParams[0];
283 | if (m_iMemory->AllocMemory((void**)&pParam0.pwstrVal, iActualSize * sizeof(WCHAR_T)))
284 | {
285 | memcpy(pParam0.pwstrVal, pwstrDesc, iActualSize * sizeof(WCHAR_T));
286 | pParam0.wstrLen = iActualSize - 1;
287 | TV_VT(&pParam0) = VTYPE_PWSTR;
288 | }
289 | }
290 |
291 | TV_VT(pvarRetValue) = VTYPE_BOOL;
292 | TV_BOOL(pvarRetValue) = true;
293 | return true;
294 | case eMethGetLastError:
295 | if (m_iMemory)
296 | {
297 | tVariant& pParam0 = paParams[0];
298 |
299 | WCHAR_T* pwstrLastError = m_Scanner.GetLastErrorDesc();
300 | if (pwstrLastError)
301 | {
302 | uint32_t iActualSize = getLenShortWcharStr(pwstrLastError) + 1;
303 | if (m_iMemory->AllocMemory((void**)&pParam0.pwstrVal, iActualSize * sizeof(WCHAR_T)))
304 | {
305 | memcpy(pParam0.pwstrVal, pwstrLastError, iActualSize * sizeof(WCHAR_T));
306 | pParam0.wstrLen = iActualSize - 1;
307 | TV_VT(&pParam0) = VTYPE_PWSTR;
308 | }
309 | }
310 | }
311 |
312 | TV_VT(pvarRetValue) = VTYPE_I4;
313 | TV_I4(pvarRetValue) = m_Scanner.GetLastErrorCode();
314 | return true;
315 | case eMethGetParameters:
316 | if (m_iMemory)
317 | {
318 | tVariant& pParam0 = paParams[0];
319 | WCHAR_T* pwstrParams = m_Scanner.GetParameters();
320 | uint32_t iActualSize = getLenShortWcharStr(pwstrParams) + 1;
321 | if (m_iMemory->AllocMemory((void**)&pParam0.pwstrVal, iActualSize * sizeof(WCHAR_T)))
322 | {
323 | memcpy(pParam0.pwstrVal, pwstrParams, iActualSize * sizeof(WCHAR_T));
324 | pParam0.wstrLen = iActualSize - 1;
325 | TV_VT(&pParam0) = VTYPE_PWSTR;
326 | }
327 | }
328 |
329 | TV_VT(pvarRetValue) = VTYPE_BOOL;
330 | TV_BOOL(pvarRetValue) = true;
331 | return true;
332 | case eMethSetParameter:
333 | {
334 | wchar_t* pwstrParam0 = 0;
335 | wchar_t* pwstrParam1 = 0;
336 |
337 | tVariant& pParam0 = paParams[0];
338 | if (pParam0.wstrLen > 0)
339 | convFromShortWchar(&pwstrParam0, pParam0.pwstrVal);
340 |
341 | tVariant& pParam1 = paParams[1];
342 | if (pParam1.wstrLen > 0)
343 | convFromShortWchar(&pwstrParam1, pParam1.pwstrVal);
344 |
345 | m_Scanner.SetParameter(pwstrParam0, pwstrParam1);
346 |
347 | if (pwstrParam0)
348 | delete pwstrParam0;
349 | if (pwstrParam1)
350 | delete pwstrParam1;
351 |
352 | TV_VT(pvarRetValue) = VTYPE_BOOL;
353 | TV_BOOL(pvarRetValue) = true;
354 | return true;
355 | }
356 | case eMethOpen:
357 | m_Scanner.Open();
358 |
359 | if (m_iMemory)
360 | {
361 | tVariant& pParam0 = paParams[0];
362 | WCHAR_T* pwstrDeviceId = m_Scanner.GetDeviceId();
363 | uint32_t iActualSize = getLenShortWcharStr(pwstrDeviceId) + 1;
364 | if (m_iMemory->AllocMemory((void**)&pParam0.pwstrVal, iActualSize * sizeof(WCHAR_T)))
365 | {
366 | memcpy(pParam0.pwstrVal, pwstrDeviceId, iActualSize * sizeof(WCHAR_T));
367 | pParam0.wstrLen = iActualSize - 1;
368 | TV_VT(&pParam0) = VTYPE_PWSTR;
369 | }
370 | }
371 |
372 | TV_VT(pvarRetValue) = VTYPE_BOOL;
373 | TV_BOOL(pvarRetValue) = true;
374 | return true;
375 | case eMethClose:
376 | m_Scanner.Close();
377 | TV_VT(pvarRetValue) = VTYPE_BOOL;
378 | TV_BOOL(pvarRetValue) = true;
379 | return true;
380 | case eMethDeviceTest:
381 | TV_VT(pvarRetValue) = VTYPE_BOOL;
382 | TV_BOOL(pvarRetValue) = true;
383 | return true;
384 | case eMethGetAdditionalActions:
385 | case eMethDoAdditionalAction:
386 | TV_VT(pvarRetValue) = VTYPE_BOOL;
387 | TV_BOOL(pvarRetValue) = true;
388 | return true;
389 | default:
390 | break;
391 | }
392 | return false;
393 | }
394 | //---------------------------------------------------------------------------//
395 | void AddInNative::SetLocale(const WCHAR_T* loc)
396 | {
397 | }
398 | //---------------------------------------------------------------------------//
399 | bool AddInNative::setMemManager(void* mem)
400 | {
401 | m_iMemory = (IMemoryManager*)mem;
402 |
403 | if (m_iMemory)
404 | m_Scanner.SetIMemory(m_iMemory);
405 |
406 | return m_iMemory != 0;
407 | }
408 | //---------------------------------------------------------------------------//
409 | void AddInNative::addError(uint32_t wcode, const wchar_t* source,
410 | const wchar_t* descriptor, long code)
411 | {
412 | if (m_iConnect)
413 | {
414 | WCHAR_T* err = 0;
415 | WCHAR_T* descr = 0;
416 |
417 | convToShortWchar(&err, source);
418 | convToShortWchar(&descr, descriptor);
419 |
420 | m_iConnect->AddError(wcode, err, descr, code);
421 |
422 | delete[] descr;
423 | delete[] err;
424 | }
425 | }
426 | //---------------------------------------------------------------------------//
427 | long AddInNative::findName(const wchar_t* names[], const wchar_t* name,
428 | const uint32_t size) const
429 | {
430 | long ret = -1;
431 | for (uint32_t i = 0; i < size; i++)
432 | {
433 | if (!wcscmp(names[i], name))
434 | {
435 | ret = i;
436 | break;
437 | }
438 | }
439 | return ret;
440 | }
441 |
--------------------------------------------------------------------------------
/Native/AddInNative.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef __ADDINNATIVE_H__
3 | #define __ADDINNATIVE_H__
4 |
5 | #include "include/ComponentBase.h"
6 | #include "include/AddInDefBase.h"
7 | #include "include/IMemoryManager.h"
8 | #include "include/mobile.h"
9 | #include "AndroidScanner.h"
10 |
11 | ///////////////////////////////////////////////////////////////////////////////
12 | // class AddInNative
13 | class AddInNative : public IComponentBase
14 | {
15 | public:
16 | enum Props
17 | {
18 | eLastProp // Always last
19 | };
20 |
21 | enum Methods
22 | {
23 | eMethGetInterfaceRevision = 0,
24 | eMethGetDescription = 1,
25 | eMethGetLastError = 2,
26 | eMethGetParameters = 3,
27 | eMethSetParameter = 4,
28 | eMethOpen = 5,
29 | eMethClose = 6,
30 | eMethDeviceTest = 7,
31 | eMethGetAdditionalActions = 8,
32 | eMethDoAdditionalAction = 9,
33 | eLastMethod // Always last
34 | };
35 |
36 | AddInNative(void);
37 | virtual ~AddInNative();
38 | // IInitDoneBase
39 | virtual bool ADDIN_API Init(void*);
40 | virtual bool ADDIN_API setMemManager(void* mem);
41 | virtual long ADDIN_API GetInfo();
42 | virtual void ADDIN_API Done();
43 | // ILanguageExtenderBase
44 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T**);
45 | virtual long ADDIN_API GetNProps();
46 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName);
47 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum, long lPropAlias);
48 | virtual bool ADDIN_API GetPropVal(const long lPropNum, tVariant* pvarPropVal);
49 | virtual bool ADDIN_API SetPropVal(const long lPropNum, tVariant* varPropVal);
50 | virtual bool ADDIN_API IsPropReadable(const long lPropNum);
51 | virtual bool ADDIN_API IsPropWritable(const long lPropNum);
52 | virtual long ADDIN_API GetNMethods();
53 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName);
54 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum,
55 | const long lMethodAlias);
56 | virtual long ADDIN_API GetNParams(const long lMethodNum);
57 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, const long lParamNum,
58 | tVariant *pvarParamDefValue);
59 | virtual bool ADDIN_API HasRetVal(const long lMethodNum);
60 | virtual bool ADDIN_API CallAsProc(const long lMethodNum,
61 | tVariant* paParams, const long lSizeArray);
62 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum,
63 | tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray);
64 | // ILocaleBase
65 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc);
66 |
67 | private:
68 | // Attributes
69 | IAddInDefBaseEx* m_iConnect;
70 | IMemoryManager* m_iMemory;
71 |
72 | CAndroidScanner m_Scanner;
73 |
74 | long findName(const wchar_t* names[], const wchar_t* name, const uint32_t size) const;
75 | void addError(uint32_t wcode, const wchar_t* source, const wchar_t* description, long code);
76 | };
77 |
78 | #endif //__ADDINNATIVE_H__
79 |
--------------------------------------------------------------------------------
/Native/AndroidScanner.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "AndroidScanner.h"
3 | #include "ConversionWchar.h"
4 | #include "jni/jnienv.h"
5 | #include
6 | #include
7 |
8 | std::wstring jstring2wstring(JNIEnv* jenv, jstring aStr)
9 | {
10 | std::wstring result;
11 |
12 | if (aStr)
13 | {
14 | const jchar* pCh = jenv->GetStringChars(aStr, 0);
15 | jsize len = jenv->GetStringLength(aStr);
16 | const jchar* temp = pCh;
17 | while (len > 0)
18 | {
19 | result += *(temp++);
20 | --len;
21 | }
22 | jenv->ReleaseStringChars(aStr, pCh);
23 | }
24 | return result;
25 | }
26 |
27 | extern "C" JNIEXPORT void JNICALL Java_com_ptolkachev_androidscanner_Scanner_OnBarcodeReceived(
28 | JNIEnv * jenv, jclass aClass, jlong pObject, jstring aBarcode)
29 | {
30 | CAndroidScanner* scanner = (CAndroidScanner*)pObject;
31 | if (scanner)
32 | {
33 | JNIEnv* jenv = getJniEnv();
34 | std::wstring barcode = jstring2wstring(jenv, aBarcode);
35 | scanner->SendReceivedBarcode(barcode);
36 | }
37 | }
38 |
39 | CAndroidScanner::CAndroidScanner() :
40 | cc(0),
41 | obj(0),
42 | cnn(0),
43 | mem(0),
44 | m_pwstrScanMode(0),
45 | m_pwstrActionName(0),
46 | m_pwstrExtraData(0),
47 | m_pwstrLastErrorDesc(0),
48 | isOpen(false)
49 | {
50 | wchar_t description[] =
51 | L"";
52 | m_pwstrDescription = 0;
53 | convToShortWchar(&m_pwstrDescription, description);
54 |
55 | wchar_t parameters[] =
56 | L"- broadcast event
- clipboard
";
57 | m_pwstrParameters = 0;
58 | convToShortWchar(&m_pwstrParameters, parameters);
59 |
60 | wchar_t deviceId[] = L"com_ptolkachev_AndroidScanner";
61 | m_pwstrDeviceId = 0;
62 | convToShortWchar(&m_pwstrDeviceId, deviceId);
63 |
64 | wchar_t deviceDesc[] = L"Android Scanner";
65 | m_pwstrDeviceDesc = 0;
66 | convToShortWchar(&m_pwstrDeviceDesc, deviceDesc);
67 | }
68 |
69 | CAndroidScanner::~CAndroidScanner()
70 | {
71 | if (isOpen)
72 | Close();
73 |
74 | if (m_pwstrScanMode)
75 | delete m_pwstrScanMode;
76 | if (m_pwstrActionName)
77 | delete m_pwstrActionName;
78 | if (m_pwstrExtraData)
79 | delete m_pwstrExtraData;
80 |
81 | delete m_pwstrDescription;
82 | if (m_pwstrLastErrorDesc)
83 | delete m_pwstrLastErrorDesc;
84 | delete m_pwstrParameters;
85 | delete m_pwstrDeviceId;
86 | delete m_pwstrDeviceDesc;
87 |
88 | JNIEnv* jenv = getJniEnv();
89 | jenv->DeleteGlobalRef(obj);
90 | jenv->DeleteGlobalRef(cc);
91 | }
92 |
93 | void CAndroidScanner::SetIConnect(IAddInDefBaseEx* piConnect)
94 | {
95 | cnn = piConnect;
96 |
97 | if (cnn)
98 | {
99 | cnn->SetEventBufferDepth(10);
100 | helper = (IAndroidComponentHelper*)cnn->GetInterface(eIAndroidComponentHelper);
101 | if (helper)
102 | {
103 | WCHAR_T* className = 0;
104 | convToShortWchar(&className, L"com/ptolkachev/androidscanner/Scanner");
105 | jclass ccloc = helper->FindClass(className);
106 | delete className;
107 | className = 0;
108 |
109 | if (ccloc)
110 | {
111 | JNIEnv* jenv = getJniEnv();
112 | cc = static_cast(jenv->NewGlobalRef(ccloc));
113 | jenv->DeleteLocalRef(ccloc);
114 |
115 | jobject activity = helper->GetActivity();
116 | jmethodID ctorID = jenv->GetMethodID(cc, "", "(Landroid/app/Activity;J)V");
117 | jobject objloc = jenv->NewObject(cc, ctorID, activity, (jlong)this);
118 | if (objloc)
119 | {
120 | obj = jenv->NewGlobalRef(objloc);
121 | jenv->DeleteLocalRef(objloc);
122 | }
123 | jenv->DeleteLocalRef(activity);
124 |
125 | // Run native
126 | jmethodID methodID_show = jenv->GetMethodID(cc, "show", "()V");
127 | jenv->CallVoidMethod(obj, methodID_show);
128 |
129 | // Methods
130 | methodID_open = jenv->GetMethodID(cc, "start", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
131 | methodID_close = jenv->GetMethodID(cc, "stop", "()V");
132 | }
133 | }
134 | }
135 | }
136 |
137 | void CAndroidScanner::SetIMemory(IMemoryManager* piMemory)
138 | {
139 | mem = piMemory;
140 | }
141 |
142 | WCHAR_T* CAndroidScanner::GetDescription()
143 | {
144 | return m_pwstrDescription;
145 | }
146 |
147 | uint32_t CAndroidScanner::GetLastErrorCode()
148 | {
149 | return 0L;
150 | }
151 |
152 | WCHAR_T* CAndroidScanner::GetLastErrorDesc()
153 | {
154 | return m_pwstrLastErrorDesc;
155 | }
156 |
157 | WCHAR_T* CAndroidScanner::GetParameters()
158 | {
159 | return m_pwstrParameters;
160 | }
161 |
162 | bool CAndroidScanner::SetParameter(wchar_t* name, wchar_t* value)
163 | {
164 | if (!name || !value)
165 | return false;
166 |
167 | if (wcscmp(name, L"ScanMode") == 0)
168 | {
169 | if (m_pwstrScanMode) {
170 | delete m_pwstrScanMode;
171 | m_pwstrScanMode = 0;
172 | }
173 |
174 | convToShortWchar(&m_pwstrScanMode, value);
175 | }
176 | if (wcscmp(name, L"ActionName") == 0)
177 | {
178 | if (m_pwstrActionName)
179 | {
180 | delete m_pwstrActionName;
181 | m_pwstrActionName = 0;
182 | }
183 |
184 | convToShortWchar(&m_pwstrActionName, value);
185 | }
186 | else if (wcscmp(name, L"ExtraData") == 0)
187 | {
188 | if (m_pwstrExtraData)
189 | {
190 | delete m_pwstrExtraData;
191 | m_pwstrExtraData = 0;
192 | }
193 |
194 | convToShortWchar(&m_pwstrExtraData, value);
195 | }
196 | else
197 | {
198 | return false;
199 | }
200 |
201 | return true;
202 | }
203 |
204 | void CAndroidScanner::Open()
205 | {
206 | JNIEnv* jenv = getJniEnv();
207 |
208 | jstring scanMode = m_pwstrScanMode != NULL ?
209 | jenv->NewString(m_pwstrScanMode, getLenShortWcharStr(m_pwstrScanMode)) :
210 | NULL;
211 | jstring actionName = m_pwstrActionName != NULL ?
212 | jenv->NewString(m_pwstrActionName, getLenShortWcharStr(m_pwstrActionName)) :
213 | NULL;
214 | jstring extraData = m_pwstrExtraData != NULL ?
215 | jenv->NewString(m_pwstrExtraData, getLenShortWcharStr(m_pwstrExtraData)) :
216 | NULL;
217 |
218 | jenv->CallVoidMethod(obj, methodID_open, scanMode, actionName, extraData);
219 |
220 | if (scanMode)
221 | jenv->DeleteLocalRef(scanMode);
222 | if (actionName)
223 | jenv->DeleteLocalRef(actionName);
224 | if (extraData)
225 | jenv->DeleteLocalRef(extraData);
226 |
227 | isOpen = true;
228 | }
229 |
230 | void CAndroidScanner::Close()
231 | {
232 | JNIEnv* jenv = getJniEnv();
233 | jenv->CallVoidMethod(obj, methodID_close);
234 |
235 | isOpen = false;
236 | }
237 |
238 | WCHAR_T* CAndroidScanner::GetDeviceId()
239 | {
240 | return m_pwstrDeviceId;
241 | }
242 |
243 | WCHAR_T* CAndroidScanner::GetDeviceDesc()
244 | {
245 | return m_pwstrDeviceDesc;
246 | }
247 |
248 | bool CAndroidScanner::IsDemoMode()
249 | {
250 | return false;
251 | }
252 |
253 | void CAndroidScanner::SendReceivedBarcode(std::wstring barcode)
254 | {
255 | if (cnn && mem)
256 | {
257 | WCHAR_T* pwstrDeviceId = NULL;
258 | uint32_t iActualSize = static_cast(getLenShortWcharStr(m_pwstrDeviceId) + 1);
259 | if (!mem->AllocMemory((void**)&pwstrDeviceId, iActualSize * sizeof(WCHAR_T)))
260 | return;
261 | memcpy(pwstrDeviceId, m_pwstrDeviceId, iActualSize * sizeof(WCHAR_T));
262 |
263 | wchar_t dataType[] = L"Штрихкод";
264 | WCHAR_T* pwstrDataType = NULL;
265 | iActualSize = static_cast(wcslen(dataType) + 1);
266 | if (!mem->AllocMemory((void**)&pwstrDataType, iActualSize * sizeof(WCHAR_T)))
267 | return;
268 | convToShortWchar(&pwstrDataType, dataType);
269 |
270 | WCHAR_T* pwstrBarCode = NULL;
271 | iActualSize = static_cast(barcode.size() + 1);
272 | if (!mem->AllocMemory((void**)&pwstrBarCode, iActualSize * sizeof(WCHAR_T)))
273 | return;
274 | convToShortWchar(&pwstrBarCode, barcode.c_str());
275 |
276 | cnn->ExternalEvent(pwstrDeviceId, pwstrDataType, pwstrBarCode);
277 |
278 | mem->FreeMemory((void**)&pwstrDeviceId);
279 | mem->FreeMemory((void**)&pwstrDataType);
280 | mem->FreeMemory((void**)&pwstrBarCode);
281 | }
282 | }
--------------------------------------------------------------------------------
/Native/AndroidScanner.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef __ANDROIDSCANNER_H__
3 | #define __ANDROIDSCANNER_H__
4 |
5 | #include "ConversionWchar.h"
6 | #include "include/AddInDefBase.h"
7 | #include "include/IAndroidComponentHelper.h"
8 | #include "include/IMemoryManager.h"
9 | #include "include/mobile.h"
10 | #include
11 |
12 | class CAndroidScanner
13 | {
14 | public:
15 | CAndroidScanner();
16 | ~CAndroidScanner();
17 |
18 | void SetIConnect(IAddInDefBaseEx* piConnect);
19 | void SetIMemory(IMemoryManager* piMemory);
20 |
21 | WCHAR_T* GetDescription();
22 |
23 | uint32_t GetLastErrorCode();
24 | WCHAR_T* GetLastErrorDesc();
25 |
26 | WCHAR_T* GetParameters();
27 | bool SetParameter(wchar_t* name, wchar_t* value);
28 |
29 | void Open();
30 | void Close();
31 |
32 | WCHAR_T* GetDeviceId();
33 | WCHAR_T* GetDeviceDesc();
34 | bool IsDemoMode();
35 |
36 | void SendReceivedBarcode(std::wstring barcode);
37 |
38 | private:
39 | jclass cc;
40 | jobject obj;
41 | IAddInDefBaseEx* cnn;
42 | IMemoryManager* mem;
43 |
44 | WCHAR_T* m_pwstrScanMode;
45 | WCHAR_T* m_pwstrActionName;
46 | WCHAR_T* m_pwstrExtraData;
47 | WCHAR_T* m_pwstrDescription;
48 | WCHAR_T* m_pwstrLastErrorDesc;
49 | WCHAR_T* m_pwstrParameters;
50 | WCHAR_T* m_pwstrDeviceId;
51 | WCHAR_T* m_pwstrDeviceDesc;
52 |
53 | bool isOpen;
54 |
55 | IAndroidComponentHelper* helper;
56 | jmethodID methodID_open;
57 | jmethodID methodID_close;
58 | };
59 |
60 | #endif
--------------------------------------------------------------------------------
/Native/ConversionWchar.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "ConversionWchar.h"
3 | #include
4 |
5 | #if defined(__APPLE__) && !defined(BUILD_DYNAMIC_LIBRARY)
6 |
7 | namespace ADD_IN_NATIVE
8 | {
9 |
10 | #endif //__APPLE__ && !BUILD_DYNAMIC_LIBRARY
11 |
12 | //---------------------------------------------------------------------------//
13 | uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len)
14 | {
15 | if (!len)
16 | len = static_cast(::wcslen(Source) + 1);
17 |
18 | if (!*Dest)
19 | *Dest = new WCHAR_T[len];
20 |
21 | WCHAR_T* tmpShort = *Dest;
22 | wchar_t* tmpWChar = (wchar_t*)Source;
23 | uint32_t res = 0;
24 |
25 | for (; len; --len, ++res, ++tmpWChar, ++tmpShort)
26 | {
27 | *tmpShort = (WCHAR_T)*tmpWChar;
28 | }
29 |
30 | return res;
31 | }
32 |
33 | //---------------------------------------------------------------------------//
34 | uint32_t convFromShortWchar(wchar_t** Dest, const WCHAR_T* Source, uint32_t len)
35 | {
36 | if (!len)
37 | len = getLenShortWcharStr(Source) + 1;
38 |
39 | if (!*Dest)
40 | *Dest = new wchar_t[len];
41 |
42 | wchar_t* tmpWChar = *Dest;
43 | WCHAR_T* tmpShort = (WCHAR_T*)Source;
44 | uint32_t res = 0;
45 |
46 | for (; len; --len, ++res, ++tmpWChar, ++tmpShort)
47 | {
48 | *tmpWChar = (wchar_t)*tmpShort;
49 | }
50 |
51 | return res;
52 | }
53 |
54 | //---------------------------------------------------------------------------//
55 | uint32_t getLenShortWcharStr(const WCHAR_T* Source)
56 | {
57 | uint32_t res = 0;
58 | WCHAR_T *tmpShort = (WCHAR_T*)Source;
59 |
60 | while (*tmpShort++)
61 | ++res;
62 |
63 | return res;
64 | }
65 | //---------------------------------------------------------------------------//
66 |
67 |
68 | //---------------------------------------------------------------------------//
69 | WcharWrapper::WcharWrapper(const wchar_t* str) :
70 |
71 | #if defined(__APPLE__) || defined(__ANDROID__)
72 |
73 | m_str_WCHAR(NULL),
74 |
75 | #endif //__APPLE__ || __ANDROID__
76 |
77 | m_str_wchar(NULL)
78 | {
79 | if (str)
80 | {
81 | int len = static_cast(wcslen(str));
82 | m_str_wchar = new wchar_t[len + 1];
83 | memset(m_str_wchar, 0, sizeof(wchar_t)* (len + 1));
84 | memcpy(m_str_wchar, str, sizeof(wchar_t)* len);
85 |
86 | #if defined(__APPLE__) || defined(__ANDROID__)
87 |
88 | convToShortWchar(&m_str_WCHAR, m_str_wchar, len + 1);
89 |
90 | #endif //__APPLE__ || __ANDROID__
91 |
92 | }
93 | }
94 |
95 | //---------------------------------------------------------------------------//
96 | #if defined(__APPLE__) || defined(__ANDROID__)
97 |
98 | WcharWrapper::WcharWrapper(const WCHAR_T* str) : m_str_WCHAR(NULL),
99 | m_str_wchar(NULL)
100 | {
101 | if (str)
102 | {
103 | int len = getLenShortWcharStr(str);
104 | m_str_WCHAR = new WCHAR_T[len + 1];
105 | memset(m_str_WCHAR, 0, sizeof(WCHAR_T) * (len + 1));
106 | memcpy(m_str_WCHAR, str, sizeof(WCHAR_T) * len);
107 | convFromShortWchar(&m_str_wchar, m_str_WCHAR);
108 | }
109 | }
110 |
111 | #endif //__APPLE__ || __ANDROID__
112 |
113 | //---------------------------------------------------------------------------//
114 | WcharWrapper::~WcharWrapper()
115 | {
116 |
117 | #if defined(__APPLE__) || defined(__ANDROID__)
118 |
119 | if (m_str_WCHAR)
120 | {
121 | delete[] m_str_WCHAR;
122 | m_str_WCHAR = NULL;
123 | }
124 |
125 | #endif //__APPLE__ || __ANDROID__
126 |
127 | if (m_str_wchar)
128 | {
129 | delete[] m_str_wchar;
130 | m_str_wchar = NULL;
131 | }
132 | }
133 |
134 | #if defined(__APPLE__) && !defined(BUILD_DYNAMIC_LIBRARY)
135 |
136 | }
137 |
138 | #endif //__APPLE__ && !BUILD_DYNAMIC_LIBRARY
139 |
140 |
--------------------------------------------------------------------------------
/Native/ConversionWchar.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef __CONVERSIONWCHAR_H__
3 | #define __CONVERSIONWCHAR_H__
4 |
5 | #include "include/types.h"
6 |
7 | #if defined(__APPLE__) && !defined(BUILD_DYNAMIC_LIBRARY)
8 |
9 | namespace ADD_IN_NATIVE
10 | {
11 |
12 | #endif //__APPLE__ && !BUILD_DYNAMIC_LIBRARY
13 |
14 | uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len = 0);
15 | uint32_t convFromShortWchar(wchar_t** Dest, const WCHAR_T* Source, uint32_t len = 0);
16 | uint32_t getLenShortWcharStr(const WCHAR_T* Source);
17 |
18 | class WcharWrapper
19 | {
20 | public:
21 |
22 | #if defined(__APPLE__) || defined(__ANDROID__)
23 |
24 | WcharWrapper(const WCHAR_T* str);
25 |
26 | #endif //__APPLE__ || __ANDROID__
27 |
28 | WcharWrapper(const wchar_t* str);
29 | ~WcharWrapper();
30 | #if defined(__APPLE__) || defined(__ANDROID__)
31 |
32 | operator const WCHAR_T*(){ return m_str_WCHAR; }
33 | operator WCHAR_T*(){ return m_str_WCHAR; }
34 |
35 | #endif //__APPLE__ || __ANDROID__
36 |
37 | operator const wchar_t*(){ return m_str_wchar; }
38 | operator wchar_t*(){ return m_str_wchar; }
39 | private:
40 | WcharWrapper& operator = (const WcharWrapper& other) { return *this; }
41 | WcharWrapper(const WcharWrapper& other) { }
42 | private:
43 |
44 | #if defined(__APPLE__) || defined(__ANDROID__)
45 |
46 | WCHAR_T* m_str_WCHAR;
47 |
48 | #endif //__APPLE__ || __ANDROID__
49 |
50 | wchar_t* m_str_wchar;
51 | };
52 |
53 | #if defined(__APPLE__) && !defined(BUILD_DYNAMIC_LIBRARY)
54 |
55 | }
56 |
57 | #endif //__APPLE__ && !BUILD_DYNAMIC_LIBRARY
58 |
59 | #endif //__CONVERSIONWCHAR_H__
60 |
--------------------------------------------------------------------------------
/Native/ScannerDriver.cpp:
--------------------------------------------------------------------------------
1 | #include "ScannerDriver.h"
2 |
3 | #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "ScannerDriver", __VA_ARGS__))
4 | #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "ScannerDriver", __VA_ARGS__))
5 |
6 | extern "C" {
7 | /* Эта тривиальная функция возвращает ABI платформы, для которой скомпилирована эта динамическая библиотека с машинным кодом.*/
8 | const char * ScannerDriver::getPlatformABI()
9 | {
10 | #if defined(__arm__)
11 | #if defined(__ARM_ARCH_7A__)
12 | #if defined(__ARM_NEON__)
13 | #define ABI "armeabi-v7a/NEON"
14 | #else
15 | #define ABI "armeabi-v7a"
16 | #endif
17 | #else
18 | #define ABI "armeabi"
19 | #endif
20 | #elif defined(__i386__)
21 | #define ABI "x86"
22 | #else
23 | #define ABI "unknown"
24 | #endif
25 | LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
26 | return "This native library is compiled with ABI: %s" ABI ".";
27 | }
28 |
29 | void ScannerDriver()
30 | {
31 | }
32 |
33 | ScannerDriver::ScannerDriver()
34 | {
35 | }
36 |
37 | ScannerDriver::~ScannerDriver()
38 | {
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Native/ScannerDriver.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | class ScannerDriver
4 | {
5 | public:
6 | const char * getPlatformABI();
7 | ScannerDriver();
8 | ~ScannerDriver();
9 | };
10 |
11 |
--------------------------------------------------------------------------------
/Native/ScannerDriver.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30517.126
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ScannerDriver", "ScannerDriver.vcxproj", "{914C3611-27CB-482E-91B4-744E2110466F}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|ARM = Debug|ARM
11 | Debug|ARM64 = Debug|ARM64
12 | Debug|x64 = Debug|x64
13 | Debug|x86 = Debug|x86
14 | Release|ARM = Release|ARM
15 | Release|ARM64 = Release|ARM64
16 | Release|x64 = Release|x64
17 | Release|x86 = Release|x86
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|ARM.ActiveCfg = Debug|ARM
21 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|ARM.Build.0 = Debug|ARM
22 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|ARM64.ActiveCfg = Debug|ARM64
23 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|ARM64.Build.0 = Debug|ARM64
24 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|x64.ActiveCfg = Debug|x64
25 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|x64.Build.0 = Debug|x64
26 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|x86.ActiveCfg = Debug|x86
27 | {914C3611-27CB-482E-91B4-744E2110466F}.Debug|x86.Build.0 = Debug|x86
28 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|ARM.ActiveCfg = Release|ARM
29 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|ARM.Build.0 = Release|ARM
30 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|ARM64.ActiveCfg = Release|ARM64
31 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|ARM64.Build.0 = Release|ARM64
32 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|x64.ActiveCfg = Release|x64
33 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|x64.Build.0 = Release|x64
34 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|x86.ActiveCfg = Release|x86
35 | {914C3611-27CB-482E-91B4-744E2110466F}.Release|x86.Build.0 = Release|x86
36 | EndGlobalSection
37 | GlobalSection(SolutionProperties) = preSolution
38 | HideSolutionNode = FALSE
39 | EndGlobalSection
40 | GlobalSection(ExtensibilityGlobals) = postSolution
41 | SolutionGuid = {4DDA0757-852A-44B5-B97B-953B1DA06F50}
42 | EndGlobalSection
43 | EndGlobal
44 |
--------------------------------------------------------------------------------
/Native/ScannerDriver.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | ARM
7 |
8 |
9 | Release
10 | ARM
11 |
12 |
13 | Debug
14 | ARM64
15 |
16 |
17 | Release
18 | ARM64
19 |
20 |
21 | Debug
22 | x64
23 |
24 |
25 | Release
26 | x64
27 |
28 |
29 | Debug
30 | x86
31 |
32 |
33 | Release
34 | x86
35 |
36 |
37 |
38 | {914c3611-27cb-482e-91b4-744e2110466f}
39 | Android
40 | ScannerDriver
41 | 14.0
42 | Android
43 | 3.0
44 |
45 |
46 |
47 | DynamicLibrary
48 | true
49 | Clang_5_0
50 |
51 |
52 | DynamicLibrary
53 | false
54 | Clang_5_0
55 |
56 |
57 | DynamicLibrary
58 | true
59 | Gcc_4_9
60 |
61 |
62 | DynamicLibrary
63 | false
64 | Clang_5_0
65 |
66 |
67 | DynamicLibrary
68 | true
69 | Clang_5_0
70 |
71 |
72 | DynamicLibrary
73 | false
74 | Clang_5_0
75 |
76 |
77 | DynamicLibrary
78 | true
79 | Clang_5_0
80 |
81 |
82 | DynamicLibrary
83 | false
84 | Clang_5_0
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | Use
110 | pch.h
111 |
112 |
113 |
114 |
115 | Use
116 | pch.h
117 |
118 |
119 |
120 |
121 | Use
122 | pch.h
123 |
124 |
125 |
126 |
127 | Use
128 | pch.h
129 |
130 |
131 |
132 |
133 | Use
134 | pch.h
135 |
136 |
137 |
138 |
139 | Use
140 | pch.h
141 |
142 |
143 |
144 |
145 | Use
146 | pch.h
147 |
148 |
149 |
150 |
151 | Use
152 | pch.h
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
--------------------------------------------------------------------------------
/Native/ScannerDriver.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | jni
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | include
17 |
18 |
19 | include
20 |
21 |
22 | include
23 |
24 |
25 | include
26 |
27 |
28 | include
29 |
30 |
31 | include
32 |
33 |
34 | include
35 |
36 |
37 | include
38 |
39 |
40 | jni
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | {bec62d74-beba-4c42-a9ab-063a1931f2a3}
49 |
50 |
51 | {222b340f-6e22-4f00-9007-9d744fbffdea}
52 |
53 |
54 |
--------------------------------------------------------------------------------
/Native/include/AddInDefBase.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Warning!!!
3 | * DO NOT ALTER THIS FILE!
4 | */
5 |
6 | #ifndef __ADAPTER_DEF_H__
7 | #define __ADAPTER_DEF_H__
8 | #include "types.h"
9 |
10 | struct IInterface
11 | {
12 | };
13 |
14 |
15 | enum Interfaces
16 | {
17 | eIMsgBox = 0,
18 | eIPlatformInfo,
19 |
20 | #if defined(__ANDROID__)
21 |
22 | eIAndroidComponentHelper,
23 |
24 | #endif
25 |
26 | };
27 |
28 | ////////////////////////////////////////////////////////////////////////////////
29 | /**
30 | * This class serves as representation of a platform for external
31 | * components External components use it to communicate with a platform.
32 | *
33 | */
34 | /// Base interface for object components.
35 | class IAddInDefBase
36 | {
37 | public:
38 | virtual ~IAddInDefBase() {}
39 | /// Adds the error message
40 | /**
41 | * @param wcode - error code
42 | * @param source - source of error
43 | * @param descr - description of error
44 | * @param scode - error code (HRESULT)
45 | * @return the result of
46 | */
47 | virtual bool ADDIN_API AddError(unsigned short wcode, const WCHAR_T* source,
48 | const WCHAR_T* descr, long scode) = 0;
49 |
50 | /// Reads a property value
51 | /**
52 | * @param wszPropName -property name
53 | * @param pVal - value being returned
54 | * @param pErrCode - error code (if any error occured)
55 | * @param errDescriptor - error description (if any error occured)
56 | * @return the result of read.
57 | */
58 | virtual bool ADDIN_API Read(WCHAR_T* wszPropName,
59 | tVariant* pVal,
60 | long *pErrCode,
61 | WCHAR_T** errDescriptor) = 0;
62 | /// Writes a property value
63 | /**
64 | * @param wszPropName - property name
65 | * @param pVar - new property value
66 | * @return the result of write.
67 | */
68 | virtual bool ADDIN_API Write(WCHAR_T* wszPropName,
69 | tVariant *pVar) = 0;
70 |
71 | ///Registers profile components
72 | /**
73 | * @param wszProfileName - profile name
74 | * @return the result of
75 | */
76 | virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName) = 0;
77 |
78 | /// Changes the depth of event buffer
79 | /**
80 | * @param lDepth - new depth of event buffer
81 | * @return the result of
82 | */
83 | virtual bool ADDIN_API SetEventBufferDepth(long lDepth) = 0;
84 | /// Returns the depth of event buffer
85 | /**
86 | * @return the depth of event buffer
87 | */
88 | virtual long ADDIN_API GetEventBufferDepth() = 0;
89 | /// Registers external event
90 | /**
91 | * @param wszSource - source of event
92 | * @param wszMessage - event message
93 | * @param wszData - message parameters
94 | * @return the result of
95 | */
96 | virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource,
97 | WCHAR_T* wszMessage,
98 | WCHAR_T* wszData) = 0;
99 | /// Clears event buffer
100 | /**
101 | */
102 | virtual void ADDIN_API CleanEventBuffer() = 0;
103 |
104 | /// Sets status line contents
105 | /**
106 | * @param wszStatusLine - new status line contents
107 | * @return the result of
108 | */
109 | virtual bool ADDIN_API SetStatusLine(WCHAR_T* wszStatusLine) = 0;
110 | /// Resets the status line contents
111 | /**
112 | * @return the result of
113 | */
114 | virtual void ADDIN_API ResetStatusLine() = 0;
115 | };
116 |
117 | class IAddInDefBaseEx :
118 | public IAddInDefBase
119 | {
120 | public:
121 | virtual ~IAddInDefBaseEx() {}
122 |
123 | virtual IInterface* ADDIN_API GetInterface(Interfaces iface) = 0;
124 | };
125 |
126 | struct IMsgBox :
127 | public IInterface
128 | {
129 | virtual bool ADDIN_API Confirm(const WCHAR_T* queryText, tVariant* retVal) = 0;
130 |
131 | virtual bool ADDIN_API Alert(const WCHAR_T* text) = 0;
132 | };
133 |
134 | struct IPlatformInfo :
135 | public IInterface
136 | {
137 | enum AppType
138 | {
139 | eAppUnknown = -1,
140 | eAppThinClient = 0,
141 | eAppThickClient,
142 | eAppWebClient,
143 | eAppServer,
144 | eAppExtConn,
145 | eAppMobileClient,
146 | eAppMobileServer,
147 | };
148 |
149 | struct AppInfo
150 | {
151 | const WCHAR_T* AppVersion;
152 | const WCHAR_T* UserAgentInformation;
153 | AppType Application;
154 | };
155 |
156 | virtual const AppInfo* ADDIN_API GetPlatformInfo() = 0;
157 | };
158 |
159 | #endif //__ADAPTER_DEF_H__
160 |
--------------------------------------------------------------------------------
/Native/include/ComponentBase.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Warning!!!
3 | * DO NOT ALTER THIS FILE!
4 | */
5 |
6 |
7 | #ifndef __COMPONENT_BASE_H__
8 | #define __COMPONENT_BASE_H__
9 |
10 | #include "types.h"
11 | ////////////////////////////////////////////////////////////////////////////////
12 | /**
13 | * The given interface is intended for initialization and
14 | * uninitialization of component and its adjustments
15 | */
16 | /// Interface of component initialization.
17 | class IInitDoneBase
18 | {
19 | public:
20 | virtual ~IInitDoneBase() {}
21 | /// Initializes component
22 | /**
23 | * @param disp - 1C:Enterpise interface
24 | * @return the result of
25 | */
26 | virtual bool ADDIN_API Init(void* disp) = 0;
27 | /// Sets the memory manager
28 | /*
29 | * @param mem - pointer to memory manager interface.
30 | * @return the result of
31 | */
32 | virtual bool ADDIN_API setMemManager(void* mem) = 0;
33 |
34 | /// Returns component version
35 | /**
36 | * @return - component version (2000 - version 2)
37 | */
38 | virtual long ADDIN_API GetInfo() = 0;
39 |
40 | /// Uninitializes component
41 | /**
42 | * Component here should release all consumed resources.
43 | */
44 | virtual void ADDIN_API Done() = 0;
45 |
46 | };
47 | ///////////////////////////////////////////////////////////////////////////
48 | /**
49 | * The given interface defines methods that are intented to be used by the Platform
50 | */
51 | /// Interface describing extension of language.
52 | class ILanguageExtenderBase
53 | {
54 | public:
55 | virtual ~ILanguageExtenderBase(){}
56 | /// Registers language extension
57 | /**
58 | * @param wsExtensionName - extension name
59 | * @return the result of
60 | */
61 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T** wsExtensionName) = 0;
62 |
63 | /// Returns number of component properties
64 | /**
65 | * @return number of properties
66 | */
67 | virtual long ADDIN_API GetNProps() = 0;
68 |
69 | /// Finds property by name
70 | /**
71 | * @param wsPropName - property name
72 | * @return property index or -1, if it is not found
73 | */
74 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName) = 0;
75 |
76 | /// Returns property name
77 | /**
78 | * @param lPropNum - property index (starting with 0)
79 | * @param lPropAlias - 0 - international alias,
80 | * 1 - russian alias. (International alias is required)
81 | * @return proeprty name or 0 if it is not found
82 | */
83 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum,
84 | long lPropAlias) = 0;
85 |
86 | /// Returns property value
87 | /**
88 | * @param lPropNum - property index (starting with 0)
89 | * @param pvarPropVal - the pointer to a variable for property value
90 | * @return the result of
91 | */
92 | virtual bool ADDIN_API GetPropVal(const long lPropNum,
93 | tVariant* pvarPropVal) = 0;
94 |
95 | /// Sets the property value
96 | /**
97 | * @param lPropNum - property index (starting with 0)
98 | * @param varPropVal - the pointer to a variable for property value
99 | * @return the result of
100 | */
101 | virtual bool ADDIN_API SetPropVal(const long lPropNum,
102 | tVariant* varPropVal) = 0;
103 |
104 | /// Is property readable?
105 | /**
106 | * @param lPropNum - property index (starting with 0)
107 | * @return true if property is readable
108 | */
109 | virtual bool ADDIN_API IsPropReadable(const long lPropNum) = 0;
110 |
111 | /// Is property writable?
112 | /**
113 | * @param lPropNum - property index (starting with 0)
114 | * @return true if property is writable
115 | */
116 | virtual bool ADDIN_API IsPropWritable(const long lPropNum) = 0;
117 |
118 | /// Returns number of component methods
119 | /**
120 | * @return number of component methods
121 | */
122 | virtual long ADDIN_API GetNMethods() = 0;
123 |
124 | /// Finds a method by name
125 | /**
126 | * @param wsMethodName - method name
127 | * @return - method index
128 | */
129 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName) = 0;
130 |
131 | /// Returns method name
132 | /**
133 | * @param lMethodNum - method index(starting with 0)
134 | * @param lMethodAlias - 0 - international alias,
135 | * 1 - russian alias. (International alias is required)
136 | * @return method name or 0 if method is not found
137 | */
138 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum,
139 | const long lMethodAlias) = 0;
140 |
141 | /// Returns number of method parameters
142 | /**
143 | * @param lMethodNum - method index (starting with 0)
144 | * @return number of parameters
145 | */
146 | virtual long ADDIN_API GetNParams(const long lMethodNum) = 0;
147 |
148 | /// Returns default value of method parameter
149 | /**
150 | * @param lMethodNum - method index(starting with 0)
151 | * @param lParamNum - parameter index (starting with 0)
152 | * @param pvarParamDefValue - the pointer to a variable for default value
153 | * @return the result of
154 | */
155 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum,
156 | const long lParamNum,
157 | tVariant *pvarParamDefValue) = 0;
158 |
159 | /// Does the method have a return value?
160 | /**
161 | * @param lMethodNum - method index (starting with 0)
162 | * @return true if the method has a return value
163 | */
164 | virtual bool ADDIN_API HasRetVal(const long lMethodNum) = 0;
165 |
166 | /// Calls the method as a procedure
167 | /**
168 | * @param lMethodNum - method index (starting with 0)
169 | * @param paParams - the pointer to array of method parameters
170 | * @param lSizeArray - the size of array
171 | * @return the result of
172 | */
173 | virtual bool ADDIN_API CallAsProc(const long lMethodNum,
174 | tVariant* paParams,
175 | const long lSizeArray) = 0;
176 |
177 | /// Calls the method as a function
178 | /**
179 | * @param lMethodNum - method index (starting with 0)
180 | * @param pvarRetValue - the pointer to returned value
181 | * @param paParams - the pointer to array of method parameters
182 | * @param lSizeArray - the size of array
183 | * @return the result of
184 | */
185 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum,
186 | tVariant* pvarRetValue,
187 | tVariant* paParams,
188 | const long lSizeArray) = 0;
189 | };
190 | ///////////////////////////////////////////////////////////////////////////
191 | /**
192 | * This interface is used to change component locale
193 | */
194 | /// Base interface for component localization.
195 | class LocaleBase
196 | {
197 | public:
198 | virtual ~LocaleBase(){}
199 | /// Changes component locale
200 | /**
201 | * @param loc - new locale (for Windows - rus_RUS,
202 | * for Linux - ru_RU, etc...)
203 | */
204 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc) = 0;
205 | };
206 |
207 | ///////////////////////////////////////////////////////////////////////////
208 | /**
209 | * The given interface is generalized, for its obligatory inheritance
210 | * in implementing components.
211 | */
212 | /// Base interface describing object as a set of properties and methods.
213 | class IComponentBase :
214 | public IInitDoneBase,
215 | public ILanguageExtenderBase,
216 | public LocaleBase
217 | {
218 | public:
219 | virtual ~IComponentBase(){}
220 | };
221 |
222 | enum AppCapabilities
223 | {
224 | eAppCapabilitiesInvalid = -1,
225 | eAppCapabilities1 = 1,
226 | eAppCapabilitiesLast = eAppCapabilities1,
227 | };
228 |
229 | /// Announcements of exported functions
230 | /**
231 | * These functions should be implemented that component can be loaded and created.
232 | */
233 | extern "C" long GetClassObject(const WCHAR_T*, IComponentBase** pIntf);
234 | extern "C" long DestroyObject(IComponentBase** pIntf);
235 | extern "C" const WCHAR_T* GetClassNames();
236 | extern "C" AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities);
237 |
238 | typedef long (*GetClassObjectPtr)(const WCHAR_T* wsName, IComponentBase** pIntf);
239 | typedef long (*DestroyObjectPtr)(IComponentBase** pIntf);
240 | typedef const WCHAR_T* (*GetClassNamesPtr)();
241 | typedef AppCapabilities (*SetPlatformCapabilitiesPtr)(const AppCapabilities capabilities);
242 |
243 | #endif //__COMPONENT_BASE_H__
244 |
--------------------------------------------------------------------------------
/Native/include/IAndroidComponentHelper.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Warning!!!
3 | * DO NOT ALTER THIS FILE!
4 | */
5 |
6 | #ifndef __IANDROIDCOMPONENTHELPER_H__
7 | #define __IANDROIDCOMPONENTHELPER_H__
8 |
9 | #include "types.h"
10 |
11 | #if defined(__ANDROID__)
12 | #include
13 |
14 | struct IAndroidComponentHelper :
15 | public IInterface
16 | {
17 | virtual jobject ADDIN_API GetActivity() = 0;
18 |
19 | virtual jclass ADDIN_API FindClass(const WCHAR_T* className) = 0;
20 | };
21 |
22 | #endif //__ANDROID__
23 |
24 | #endif //__IANDROIDCOMPONENTHELPER_H__
25 |
--------------------------------------------------------------------------------
/Native/include/IMemoryManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Warning!!!
3 | * DO NOT ALTER THIS FILE!
4 | */
5 |
6 |
7 | #ifndef __IMEMORY_MANAGER_H__
8 | #define __IMEMORY_MANAGER_H__
9 |
10 | ///////////////////////////////////////////////////////////////////////////////
11 | /**
12 | * The given class allocates and releases memory for a component
13 | */
14 | /// Interface representing memory manager.
15 | class IMemoryManager
16 | {
17 | public:
18 | virtual ~IMemoryManager() {}
19 | /// Allocates memory of specified size
20 | /**
21 | * @param pMemory - the double pointer to variable, that will hold newly
22 | * allocated block of memory of NULL if allocation fails.
23 | * @param ulCountByte - memory size
24 | * @return the result of
25 | */
26 | virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0;
27 | /// Releases memory
28 | /**
29 | * @param pMemory - The double pointer to the memory block being released
30 | */
31 | virtual void ADDIN_API FreeMemory (void** pMemory) = 0;
32 | };
33 |
34 | #endif //__IMEMORY_MANAGER_H__
35 |
--------------------------------------------------------------------------------
/Native/include/addinlib.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | enum AddInComponentType
4 | {
5 | eAddInCom = 1,
6 | eAddInNative,
7 | eAddInJava,
8 | eAddInvalid = -1
9 | };
10 |
--------------------------------------------------------------------------------
/Native/include/com.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef __COM_H__
3 | #define __COM_H__
4 |
5 | #if defined(__linux__) || defined(__APPLE__) || defined(__ANDROID__)
6 |
7 | #ifdef __ANDROID__
8 |
9 | typedef struct {
10 | unsigned int Data1;
11 | unsigned short Data2;
12 | unsigned short Data3;
13 | unsigned char Data4[ 8 ];
14 | } uuid_t;
15 |
16 | #else
17 | #include
18 | #endif //__ANDROID__
19 |
20 | #ifndef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ // iOS
21 | #include
22 | #endif //!__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
23 |
24 | #pragma GCC system_header
25 |
26 | typedef long HRESULT;
27 |
28 | #ifdef __GNUC__
29 | #define STDMETHODCALLTYPE __attribute__ ((__stdcall__))
30 | #define DECLSPEC_NOTHROW __attribute__ ((nothrow))
31 | #define STDMETHOD(method) virtual DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method
32 | #else
33 | #define STDMETHODCALLTYPE
34 | #endif
35 |
36 | #define __stdcall STDMETHODCALLTYPE
37 | #define near
38 | #define far
39 | #define CONST const
40 | #define FAR far
41 |
42 | typedef unsigned long DWORD;
43 | #ifndef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ // iOS
44 | typedef int BOOL;
45 | #elif defined(__LP64__)
46 | typedef bool BOOL;
47 | #else
48 | typedef signed char BOOL;
49 | #endif //!__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
50 |
51 | typedef void VOID;
52 | typedef short SHORT;
53 | typedef unsigned char BYTE;
54 | typedef unsigned short WORD;
55 | typedef float FLOAT;
56 | typedef FLOAT *PFLOAT;
57 | typedef BOOL near *PBOOL;
58 | typedef BOOL far *LPBOOL;
59 | typedef BYTE near *PBYTE;
60 | typedef BYTE far *LPBYTE;
61 | typedef int near *PINT;
62 | typedef int far *LPINT;
63 | typedef WORD near *PWORD;
64 | typedef WORD far *LPWORD;
65 | typedef long far *LPLONG;
66 | typedef DWORD near *PDWORD;
67 | typedef DWORD far *LPDWORD;
68 | typedef void far *LPVOID;
69 | typedef CONST void far *LPCVOID;
70 | typedef wchar_t *BSTR;
71 | typedef long SCODE;
72 | typedef int INT;
73 | typedef unsigned int UINT;
74 | typedef unsigned int *PUINT;
75 | typedef wchar_t WCHAR;
76 | typedef wchar_t OLECHAR;
77 | typedef wchar_t *LPOLESTR;
78 | typedef const wchar_t *LPCOLESTR;
79 | typedef DWORD LCID;
80 | typedef PDWORD PLCID;
81 | typedef long LONG;
82 | typedef unsigned long ULONG;
83 | typedef long long LONGLONG;
84 | typedef unsigned long long ULONGLONG;
85 | typedef LONG DISPID;
86 | typedef double DOUBLE;
87 | typedef double DATE;
88 | typedef short VARIANT_BOOL;
89 | typedef void *PVOID;
90 | typedef char CHAR;
91 | typedef CONST CHAR *LPCSTR;
92 | typedef unsigned short USHORT;
93 | typedef void *HMODULE;
94 | #define OLESTR(str) L##str
95 |
96 | typedef uuid_t GUID;
97 | typedef uuid_t IID;
98 | typedef uuid_t UUID;
99 | #define REFIID const IID &
100 | #define MAX_PATH 260
101 |
102 | #define IsEqualIID(x,y) uuid_compare((x),(y))
103 | #ifdef __GNUC__
104 | #define LoadLibraryA(x) dlopen((x), RTLD_LAZY)
105 | #define FreeLibrary(x) dlclose((x))
106 | #define GetProcAddress(x, y) dlsym((x), (y))
107 | #endif //__GNUC__
108 |
109 | #define E_FAIL 0x80004005L
110 | #define S_OK 0L
111 | #define S_FALSE 1L
112 | #define E_NOINTERFACE 0x80004002L
113 | #define E_NOTIMPL 0x80004001L
114 | #define E_INVALIDARG 0x80070057L
115 | #define E_UNEXPECTED 0x8000FFFFL
116 | #define E_OUTOFMEMORY 0x8007000EL
117 | #define DISP_E_UNKNOWNNAME 0x80020006L
118 | #define DISPID_UNKNOWN ( -1 )
119 | #define TRUE 1
120 | #define FALSE 0
121 |
122 | typedef long ITypeInfo;
123 |
124 | #if defined (__GNUC__) && !defined (NONAMELESSUNION)
125 | __extension__ /* no named members */
126 | #endif
127 | union tCY {
128 | __extension__ struct
129 | {
130 | unsigned long Lo;
131 | long Hi;
132 | };
133 | long long int64;
134 | };
135 | typedef union tagCY CY;
136 | #define CLSIDFromString(x,y) uuid_parse((x),(unsigned char*)(y))
137 |
138 | #endif //defined(__linux__) || defined(__APPLE__)
139 |
140 | #endif //__COM_H__
141 |
--------------------------------------------------------------------------------
/Native/include/mobile.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #if defined(__ANDROID__)
4 |
5 | #define MOBILE_PLATFORM_ANDROID 1
6 |
7 | #elif defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__)
8 |
9 | #define MOBILE_PLATFORM_IOS 1
10 |
11 | #elif defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP)
12 |
13 | #define MOBILE_PLATFORM_WINRT 1
14 |
15 | #endif
16 |
17 | #include "types.h"
18 |
19 | #if defined(MOBILE_PLATFORM_IOS)
20 |
21 | extern "C" VOID RegisterLibrary(LPCSTR, LPCVOID, LPCVOID);
22 |
23 | #define DECLARE_DLL(name, fnTable) \
24 | namespace { static struct s { s() { RegisterLibrary(name, NULL, fnTable); }} s; }
25 |
26 | #endif //MOBILE_PLATFORM_IOS
27 |
28 |
--------------------------------------------------------------------------------
/Native/include/types.h:
--------------------------------------------------------------------------------
1 |
2 | #ifndef __CON_TYPES_H__
3 | #define __CON_TYPES_H__
4 |
5 | #if defined(_WINDOWS) || defined(WINAPI_FAMILY)
6 | #include
7 | #endif
8 |
9 | #if defined(WINAPI_FAMILY)
10 | #include
11 | #endif
12 |
13 | #if __GNUC__ >=3
14 | #pragma GCC system_header
15 | #endif
16 |
17 | #include "com.h"
18 | #include
19 | #include
20 | #include
21 | #include
22 |
23 | #define EXTERN_C extern "C"
24 |
25 | #ifdef __GNUC__
26 | #define _ANONYMOUS_UNION __extension__
27 | #define _ANONYMOUS_STRUCT __extension__
28 | #else
29 | #define _ANONYMOUS_UNION
30 | #define _ANONYMOUS_STRUCT
31 | #endif //__GNUC__
32 |
33 | #ifdef NONAMELESSUNION
34 | #define __VARIANT_NAME_1 u
35 | #define __VARIANT_NAME_2 iface
36 | #define __VARIANT_NAME_3 str
37 | #define __VARIANT_NAME_4 wstr
38 | #else
39 | #define __VARIANT_NAME_1
40 | #define __VARIANT_NAME_2
41 | #define __VARIANT_NAME_3
42 | #define __VARIANT_NAME_4
43 | #endif //NONAMELESSUNION
44 |
45 | #define RESULT_FROM_ERRNO(x) ((long)(x) <= 0 ? ((long)(x)) \
46 | : ((long) (((x) & 0x0000FFFF) | (BASE_ERRNO << 16) | 0x80000000)))
47 |
48 | #define ADDIN_E_NONE 1000
49 | #define ADDIN_E_ORDINARY 1001
50 | #define ADDIN_E_ATTENTION 1002
51 | #define ADDIN_E_IMPORTANT 1003
52 | #define ADDIN_E_VERY_IMPORTANT 1004
53 | #define ADDIN_E_INFO 1005
54 | #define ADDIN_E_FAIL 1006
55 | #define ADDIN_E_MSGBOX_ATTENTION 1007
56 | #define ADDIN_E_MSGBOX_INFO 1008
57 | #define ADDIN_E_MSGBOX_FAIL 1009
58 |
59 | #ifndef ADDIN_API
60 | #ifdef _WINDOWS
61 | #define ADDIN_API __stdcall
62 | #else
63 | //#define ADDIN_API __attribute__ ((__stdcall__))
64 | #define ADDIN_API
65 | #endif //_WINDOWS
66 | #endif //ADDIN_API
67 |
68 | #include
69 |
70 | #ifdef _WINDOWS
71 | #define WCHAR_T wchar_t
72 | #else
73 | #define WCHAR_T uint16_t
74 | #endif //_WINDOWS
75 | typedef unsigned short TYPEVAR;
76 | enum ENUMVAR
77 | {
78 | VTYPE_EMPTY = 0,
79 | VTYPE_NULL,
80 | VTYPE_I2, //int16_t
81 | VTYPE_I4, //int32_t
82 | VTYPE_R4, //float
83 | VTYPE_R8, //double
84 | VTYPE_DATE, //DATE (double)
85 | VTYPE_TM, //struct tm
86 | VTYPE_PSTR, //struct str string
87 | VTYPE_INTERFACE, //struct iface
88 | VTYPE_ERROR, //int32_t errCode
89 | VTYPE_BOOL, //bool
90 | VTYPE_VARIANT, //struct _tVariant *
91 | VTYPE_I1, //int8_t
92 | VTYPE_UI1, //uint8_t
93 | VTYPE_UI2, //uint16_t
94 | VTYPE_UI4, //uint32_t
95 | VTYPE_I8, //int64_t
96 | VTYPE_UI8, //uint64_t
97 | VTYPE_INT, //int Depends on architecture
98 | VTYPE_UINT, //unsigned int Depends on architecture
99 | VTYPE_HRESULT, //long hRes
100 | VTYPE_PWSTR, //struct wstr
101 | VTYPE_BLOB, //means in struct str binary data contain
102 | VTYPE_CLSID, //UUID
103 | VTYPE_STR_BLOB = 0xfff,
104 | VTYPE_VECTOR = 0x1000,
105 | VTYPE_ARRAY = 0x2000,
106 | VTYPE_BYREF = 0x4000, //Only with struct _tVariant *
107 | VTYPE_RESERVED = 0x8000,
108 | VTYPE_ILLEGAL = 0xffff,
109 | VTYPE_ILLEGALMASKED = 0xfff,
110 | VTYPE_TYPEMASK = 0xfff
111 | } ;
112 | #if defined (__GNUC__) && !defined (NONAMELESSUNION)
113 | __extension__ /* no named members */
114 | #endif
115 | struct _tVariant
116 | {
117 | _ANONYMOUS_UNION union
118 | {
119 | int8_t i8Val;
120 | int16_t shortVal;
121 | int32_t lVal;
122 | int intVal;
123 | unsigned int uintVal;
124 | int64_t llVal;
125 | uint8_t ui8Val;
126 | uint16_t ushortVal;
127 | uint32_t ulVal;
128 | uint64_t ullVal;
129 | int32_t errCode;
130 | long hRes;
131 | float fltVal;
132 | double dblVal;
133 | bool bVal;
134 | char chVal;
135 | wchar_t wchVal;
136 | DATE date;
137 | IID IDVal;
138 | struct _tVariant *pvarVal;
139 | struct tm tmVal;
140 | _ANONYMOUS_STRUCT struct
141 | {
142 | void* pInterfaceVal;
143 | IID InterfaceID;
144 | } __VARIANT_NAME_2/*iface*/;
145 | _ANONYMOUS_STRUCT struct
146 | {
147 | char* pstrVal;
148 | uint32_t strLen; //count of bytes
149 | } __VARIANT_NAME_3/*str*/;
150 | _ANONYMOUS_STRUCT struct
151 | {
152 | WCHAR_T* pwstrVal;
153 | uint32_t wstrLen; //count of symbol
154 | } __VARIANT_NAME_4/*wstr*/;
155 | } __VARIANT_NAME_1;
156 | uint32_t cbElements; //Dimension for an one-dimensional array in pvarVal
157 | TYPEVAR vt;
158 | };
159 | typedef struct _tVariant tVariant;
160 | typedef tVariant tVariantArg;
161 |
162 |
163 | #if defined(NONAMELESSUNION)
164 | #define TV_JOIN(X, Y) ((X)->u.Y)
165 | #else
166 | #define TV_JOIN(X, Y) ((X)->Y)
167 | #endif
168 |
169 | #define TV_VT(X) ((X)->vt)
170 | #define TV_ISBYREF(X) (TV_VT(X)&VT_BYREF)
171 | #define TV_ISARRAY(X) (TV_VT(X)&VT_ARRAY)
172 | #define TV_ISVECTOR(X) (TV_VT(X)&VT_VECTOR)
173 | #define TV_NONE(X) TV_I2(X)
174 |
175 | #define TV_UI1(X) TV_JOIN(X, ui8Val)
176 | #define TV_I2(X) TV_JOIN(X, shortVal)
177 | #define TV_I4(X) TV_JOIN(X, lVal)
178 | #define TV_I8(X) TV_JOIN(X, llVal)
179 | #define TV_R4(X) TV_JOIN(X, fltVal)
180 | #define TV_R8(X) TV_JOIN(X, dblVal)
181 | #define TV_I1(X) TV_JOIN(X, i8Val)
182 | #define TV_UI2(X) TV_JOIN(X, ushortVal)
183 | #define TV_UI4(X) TV_JOIN(X, ulVal)
184 | #define TV_UI8(X) TV_JOIN(X, ullVal)
185 | #define TV_INT(X) TV_JOIN(X, intVal)
186 | #define TV_UINT(X) TV_JOIN(X, uintVal)
187 |
188 | #ifdef _WIN64
189 | #define TV_INT_PTR(X) TV_JOIN(X, llVal)
190 | #define TV_UINT_PTR(X) TV_JOIN(X, ullVal)
191 | #else
192 | #define TV_INT_PTR(X) TV_JOIN(X, lVal)
193 | #define TV_UINT_PTR(X) TV_JOIN(X, ulVal)
194 | #endif
195 |
196 |
197 | #define TV_DATE(X) TV_JOIN(X, date)
198 | #define TV_STR(X) TV_JOIN(X, pstrVal)
199 | #define TV_WSTR(X) TV_JOIN(X, pwstrVal)
200 | #define TV_BOOL(X) TV_JOIN(X, bVal)
201 | #define TV_UNKNOWN(X) TV_JOIN(X, pInterfaceVal)
202 | #define TV_VARIANTREF(X) TV_JOIN(X, pvarVal)
203 |
204 | void tVarInit(tVariant* tvar);
205 |
206 | inline
207 | void tVarInit(tVariant* tvar)
208 | {
209 | assert(tvar != NULL);
210 | memset(tvar, 0, sizeof(tVariant));
211 | TV_VT(tvar) = VTYPE_EMPTY;
212 | }
213 | //----------------------------------------------------------------------------//
214 | // static setter functions...
215 |
216 | #define DATA_SET_BEGIN(data_) \
217 | tVarInit(data_);
218 |
219 | #define DATA_SET_END(data_, type_) \
220 | TV_VT(data_) = type_;
221 |
222 |
223 | #define DATA_SET(data_, type_, member_, value_) \
224 | DATA_SET_BEGIN(data_) \
225 | TV_JOIN(data_, member_) = value_; \
226 | DATA_SET_END(data_, type_)
227 |
228 | #define DATA_SET_WITH_CAST(data_, type_, member_, cast_, value_) \
229 | DATA_SET_BEGIN(data_) \
230 | TV_JOIN(data_, member_) = cast_ value_; \
231 | DATA_SET_END(data_, type_)
232 |
233 | #endif //__CON_TYPES_H__
234 |
--------------------------------------------------------------------------------
/Native/jni/jnienv.cpp:
--------------------------------------------------------------------------------
1 | #include "jnienv.h"
2 |
3 | #include
4 | #include
5 |
6 | static JavaVM* sJavaVM = NULL;
7 |
8 | void trace(const char* format, ...)
9 | {
10 | va_list args;
11 | va_start(args, format);
12 | __android_log_vprint(ANDROID_LOG_INFO, "AndroidScannerNative", format, args);
13 | va_end(args);
14 | }
15 |
16 | JNIEnv* getJniEnv()
17 | {
18 | trace("getJniEnv()");
19 |
20 | JNIEnv* env = NULL;
21 |
22 | switch (sJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6))
23 | {
24 | case JNI_OK:
25 | trace("GetEnv(), env = %08X", env);
26 | return env;
27 |
28 | case JNI_EDETACHED:
29 | {
30 | JavaVMAttachArgs args;
31 | args.name = NULL;
32 | args.group = NULL;
33 | args.version = JNI_VERSION_1_6;
34 |
35 | if (!sJavaVM->AttachCurrentThreadAsDaemon(&env, &args))
36 | {
37 | trace("AttachCurrentThreadAsDaemon(), env = %08X", env);
38 | return env;
39 | }
40 | break;
41 | }
42 |
43 | }
44 | return NULL;
45 | };
46 |
47 | extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* aJavaVM, void* aReserved)
48 | {
49 | trace("JNI_OnLoad()");
50 | sJavaVM = aJavaVM;
51 | return JNI_VERSION_1_6;
52 | }
53 |
54 |
55 | extern "C" JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* aJavaVM, void* aReserved)
56 | {
57 | sJavaVM = NULL;
58 | }
59 |
60 | extern "C" JNIEXPORT void JNICALL Java_com_stepCounterPackage_stepCounterLib_StepCounterClass_NativeTrace(JNIEnv* jenv, jclass aClass, jstring aStr)
61 | {
62 | const char* jchars = jenv->GetStringUTFChars(aStr, NULL);
63 | trace(jchars);
64 | jenv->ReleaseStringUTFChars(aStr, jchars);
65 | }
66 |
--------------------------------------------------------------------------------
/Native/jni/jnienv.h:
--------------------------------------------------------------------------------
1 | #ifndef __JNIENV_H__
2 | #define __JNIENV_H__
3 |
4 | ///////////////////////////////////////////////////////////////////////////////
5 |
6 | #include
7 |
8 | void trace(const char* format, ...);
9 | JNIEnv* getJniEnv();
10 |
11 | ///////////////////////////////////////////////////////////////////////////////
12 |
13 | #endif //__JNIENV_H__
--------------------------------------------------------------------------------
/Native/pch.h:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | #include
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Драйвер сканера штрихкодов android устройств (ТСД) для мобильного клиента 1С.
2 |
3 | Реализован в виде внешней компонеты 1С с использованием технологии Native и с учетом требований к разразботке драйверов подключаемого оборудования 1С версии 3.3.
4 |
5 | Поддерживаются два режима сканирования:
6 | - **broadcast event**;
7 | - **clipboard**.
8 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonCommands/НастройкаСканераШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | НастройкаСканераШтрихкодовAndroid
6 |
7 |
8 | ru
9 | Настройка cканера штрихкодов Android
10 |
11 |
12 |
13 | ActionsPanelTools
14 | Auto
15 |
16 |
17 |
18 | false
19 |
20 | Single
21 | false
22 | Auto
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonCommands/НастройкаСканераШтрихкодовAndroid/Ext/CommandModule.bsl:
--------------------------------------------------------------------------------
1 |
2 | &НаКлиенте
3 | Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
4 |
5 | ОткрытьФорму("ОбщаяФорма.НастройкаДрайвераСканераШтрихкодовAndroid");
6 |
7 | КонецПроцедуры
8 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonForms/НастройкаДрайвераСканераШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | НастройкаДрайвераСканераШтрихкодовAndroid
6 |
7 |
8 | ru
9 | Настройка драйвера сканера штрихкодов Android
10 |
11 |
12 |
13 | Managed
14 | false
15 |
16 | PlatformApplication
17 | MobilePlatformApplication
18 |
19 | false
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonForms/НастройкаДрайвераСканераШтрихкодовAndroid/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonForms/НастройкаДрайвераСканераШтрихкодовAndroid/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
2 | // (с) Tolkachev Pavel, 2020
3 | //
4 | // Licensed under the Apache License, Version 2.0 (the "License");
5 | // you may not use this file except in compliance with the License.
6 | // You may obtain a copy of the License at
7 | //
8 | // http://www.apache.org/licenses/LICENSE-2.0
9 | //
10 | // Unless required by applicable law or agreed to in writing, software
11 | // distributed under the License is distributed on an "AS IS" BASIS,
12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | // See the License for the specific language governing permissions and
14 | // limitations under the License.
15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
16 |
17 | #Область ОбработчикиСобытийФормы
18 |
19 | &НаКлиенте
20 | Процедура ПриОткрытии(Отказ)
21 |
22 | УстановитьВидимостьПараметров();
23 |
24 | Если НаборКонстант.ИспользоватьСканерШтрихкодовAndroid Тогда
25 |
26 | УстройствоИспользуется = (глПараметрыСканераШтрихкодовAndroid.Сканер <> Неопределено);
27 | Если УстройствоИспользуется Тогда
28 | Элементы.Страницы.ТекущаяСтраница = Элементы.УстройствоИспользуется;
29 | Иначе
30 | ОбновитьИнформациюОДрайвере();
31 | КонецЕсли;
32 |
33 | КонецЕсли;
34 |
35 | КонецПроцедуры
36 |
37 | #КонецОбласти
38 |
39 | #Область ОбработчикиСобытийЭлементовФормы
40 |
41 | &НаКлиенте
42 | Процедура ИспользоватьСканерШтрихкодовAndroidПриИзменении(Элемент)
43 |
44 | Подключаемый_ПриИзмененииРеквизита(Элемент);
45 | МенеджерСканераШтрихкодовAndroidКлиент.УстановитьПараметрыСканера();
46 |
47 | УстановитьВидимостьПараметров();
48 |
49 | Если НаборКонстант.ИспользоватьСканерШтрихкодовAndroid Тогда
50 | ОбновитьИнформациюОДрайвере();
51 | КонецЕсли;
52 |
53 | КонецПроцедуры
54 |
55 | &НаКлиенте
56 | Процедура ActionNameПриИзменении(Элемент)
57 |
58 | УстановитьПараметрСканера("ActionName", ActionName);
59 |
60 | КонецПроцедуры
61 |
62 | &НаКлиенте
63 | Процедура ExtraDataПриИзменении(Элемент)
64 |
65 | УстановитьПараметрСканера("ExtraData", ExtraData);
66 |
67 | КонецПроцедуры
68 |
69 | #КонецОбласти
70 |
71 | #Область ОбработчикиКомандФормы
72 |
73 | &НаКлиенте
74 | Процедура УстановитьДрайвер(Команда)
75 |
76 | Оповещение = Новый ОписаниеОповещения("УстановкаДрайвераЗавершение", ЭтотОбъект);
77 | МенеджерСканераШтрихкодовAndroidКлиент.НачатьУстановкуДрайвера(Оповещение);
78 |
79 | КонецПроцедуры
80 |
81 | &НаКлиенте
82 | Процедура УстановкаДрайвераЗавершение(ДопПараметры) Экспорт
83 |
84 | ОбновитьИнформациюОДрайвере();
85 |
86 | Сообщение = Новый СообщениеПользователю;
87 | Сообщение.Текст = НСтр("ru='Установка драйвера завершена.'");
88 | Сообщение.Сообщить();
89 |
90 | КонецПроцедуры
91 |
92 | #КонецОбласти
93 |
94 | #Область СлужебныеПроцедурыИФункции
95 |
96 | &НаКлиенте
97 | Процедура ОбновитьИнформациюОДрайвере()
98 |
99 | Элементы.Страницы.ТекущаяСтраница = Элементы.ДрайверПолучениеИнформации;
100 |
101 | Оповещение = Новый ОписаниеОповещения("ПолучениеДрайвераЗавершение", ЭтотОбъект);
102 | МенеджерСканераШтрихкодовAndroidКлиент.НачатьПодключениеДрайвера(Оповещение);
103 |
104 | КонецПроцедуры
105 |
106 | &НаКлиенте
107 | Процедура ПолучениеДрайвераЗавершение(Успешно, ДопПараметры) Экспорт
108 |
109 | ИзмененаКонстантаДрайверУстановлен = Ложь;
110 |
111 | Если Успешно Тогда
112 |
113 | Элементы.Страницы.ТекущаяСтраница = Элементы.ДрайверУстановлен;
114 |
115 | глПараметрыСканераШтрихкодовAndroid.Свойство("ActionName", ActionName);
116 | глПараметрыСканераШтрихкодовAndroid.Свойство("ExtraData", ExtraData);
117 |
118 | Если Не НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен Тогда
119 | НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен = Истина;
120 | ИзмененаКонстантаДрайверУстановлен = Истина;
121 | КонецЕсли;
122 |
123 | Иначе
124 |
125 | Элементы.Страницы.ТекущаяСтраница = Элементы.ДрайверНеУстановлен;
126 |
127 | Если НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен Тогда
128 | НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен = Ложь;
129 | ИзмененаКонстантаДрайверУстановлен = Истина;
130 | КонецЕсли;
131 |
132 | КонецЕсли;
133 |
134 | Если ИзмененаКонстантаДрайверУстановлен Тогда
135 | КонстантаИмя = СохранитьЗначениеРеквизита("НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен");
136 | Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя);
137 |
138 | МенеджерСканераШтрихкодовAndroidКлиент.УстановитьПараметрыСканера();
139 | КонецЕсли;
140 |
141 | КонецПроцедуры
142 |
143 | &НаКлиенте
144 | Процедура Подключаемый_ПриИзмененииРеквизита(Элемент)
145 |
146 | КонстантаИмя = ПриИзмененииРеквизитаСервер(Элемент.Имя);
147 | Оповестить("Запись_НаборКонстант", Новый Структура, КонстантаИмя);
148 |
149 | КонецПроцедуры
150 |
151 | &НаСервере
152 | Функция ПриИзмененииРеквизитаСервер(ИмяЭлемента)
153 |
154 | РеквизитПутьДанным = Элементы[ИмяЭлемента].ПутьКДанным;
155 | КонстантаИмя = СохранитьЗначениеРеквизита(РеквизитПутьДанным);
156 |
157 | Возврат КонстантаИмя;
158 |
159 | КонецФункции
160 |
161 | &НаСервере
162 | Функция СохранитьЗначениеРеквизита(РеквизитПутьКДанным)
163 |
164 | Префикс = "НаборКонстант.";
165 | КонстантаИмя = Сред(РеквизитПутьКДанным, СтрДлина(Префикс) + 1);
166 |
167 | КонстантаМенеджер = Константы[КонстантаИмя];
168 | КонстантаЗначение = НаборКонстант[КонстантаИмя];
169 |
170 | Если КонстантаМенеджер.Получить() <> КонстантаЗначение Тогда
171 | КонстантаМенеджер.Установить(КонстантаЗначение);
172 | КонецЕсли;
173 |
174 | Возврат КонстантаИмя;
175 |
176 | КонецФункции
177 |
178 | &НаКлиенте
179 | Процедура УстановитьВидимостьПараметров()
180 |
181 | Элементы.Страницы.Видимость = НаборКонстант.ИспользоватьСканерШтрихкодовAndroid;
182 |
183 | КонецПроцедуры
184 |
185 | &НаКлиенте
186 | Процедура УстановитьПараметрСканера(ИмяПараметра, ЗначениеПараметра)
187 |
188 | глПараметрыСканераШтрихкодовAndroid.Вставить(ИмяПараметра, ЗначениеПараметра);
189 |
190 | СохранитьПараметрыСканера();
191 |
192 | Оповестить("Запись_НаборКонстант", Новый Структура, "ПараметрыСканераШтрихкодовAndroid");
193 |
194 | КонецПроцедуры
195 |
196 | &НаСервере
197 | Процедура СохранитьПараметрыСканера()
198 |
199 | ПараметрыСканера = Новый Структура;
200 | ПараметрыСканера.Вставить("ActionName", ActionName);
201 | ПараметрыСканера.Вставить("ExtraData", ExtraData);
202 |
203 | ПараметрыСканераХранилище = Новый ХранилищеЗначения(ПараметрыСканера);
204 | Константы.ПараметрыСканераШтрихкодовAndroid.Установить(ПараметрыСканераХранилище);
205 |
206 | КонецПроцедуры
207 |
208 | #КонецОбласти
--------------------------------------------------------------------------------
/ScannerLibMA/CommonModules/МенеджерСканераШтрихкодовAndroidВызовСервера.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | МенеджерСканераШтрихкодовAndroidВызовСервера
6 |
7 |
8 | ru
9 | Менеджер сканера штрихкодов android вызов сервера
10 |
11 |
12 |
13 | false
14 | false
15 | true
16 | false
17 | false
18 | true
19 | false
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonModules/МенеджерСканераШтрихкодовAndroidВызовСервера/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
2 | // (с) Tolkachev Pavel, 2020
3 | //
4 | // Licensed under the Apache License, Version 2.0 (the "License");
5 | // you may not use this file except in compliance with the License.
6 | // You may obtain a copy of the License at
7 | //
8 | // http://www.apache.org/licenses/LICENSE-2.0
9 | //
10 | // Unless required by applicable law or agreed to in writing, software
11 | // distributed under the License is distributed on an "AS IS" BASIS,
12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | // See the License for the specific language governing permissions and
14 | // limitations under the License.
15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
16 |
17 | #Область ПрограммныйИнтерфейс
18 |
19 | // Возвращает параметры сканера штрихкодов.
20 | //
21 | // Возвращаемое значение:
22 | // Структура - параметры сканера штрихкодов:
23 | // * УстройствоИспользуется - Булево - Истина, если сканер штрихкодов используется в приложении.
24 | // * ActionName - Строка - значение action для IntentFilter событий сканера (broadcast) в системе Android.
25 | // Определяется производителем устройства. Обычно, находится в настройках сканера. Свойство
26 | // отсутствует, если параметры сканера не заданы.
27 | // * ExtraData - Строка - значение Intent, из которого извлекается штрих код. Определяется производителем устройства.
28 | // Обычно, находится в настройках сканера. Свойство отсутствует, если параметры сканера не
29 | // заданы.
30 | // * СканерШтрихкодов - Структура - описание объекта подключенного сканера. Устройство подключается при открытии
31 | // формы. Свойство заполнено, если есть хотя бы одна форма клиенского приложения в
32 | // данный момент работает со сканером. При закрытии последней (или единственной)
33 | // формы, работающей со сканером, значение свойства становится Неопределно.
34 | // * ОбъектДрайвера - ВнешняяКомпонента - объект, созданный из внешней компоненты драйвера для вызова его методов.
35 | // * Клиенты - Массив - массив идентификаторов открытых форм, которые работают со сканером. При открытии новой
36 | // формы клиентского приложения, работающей со сканером, её идентификатор добавляется в этот
37 | // массив. При закрытии идентификатор этой формы удаляется из массива. При закрытии последней
38 | // формы устройство будет отключено.
39 | // * КоличествоПодключенных - Число - количество подключенных форм клиентского приложения.
40 | //
41 | // * СобытиеОбработано - Булево - используется для предотвращения повторной обработки события.
42 | //
43 | Функция ПолучитьПараметрыСканера() Экспорт
44 |
45 | ПараметрыСканераХранилище = Константы.ПараметрыСканераШтрихкодовAndroid.Получить();
46 | ПараметрыСканера = ПараметрыСканераХранилище.Получить();
47 |
48 | Если ПараметрыСканера = Неопределено Тогда
49 | ПараметрыСканера = Новый Структура;
50 | КонецЕсли;
51 |
52 | ПараметрыСканера.Вставить("УстройствоИспользуется",
53 | Константы.ИспользоватьСканерШтрихкодовAndroid.Получить()
54 | И Константы.ДрайверСканераШтрихкодовAndroidУстановлен.Получить()
55 | );
56 | ПараметрыСканера.Вставить("Сканер", Неопределено);
57 | ПараметрыСканера.Вставить("СобытиеОбработано", Ложь);
58 |
59 | Возврат ПараметрыСканера;
60 |
61 | КонецФункции
62 |
63 | #КонецОбласти
--------------------------------------------------------------------------------
/ScannerLibMA/CommonModules/МенеджерСканераШтрихкодовAndroidКлиент.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | МенеджерСканераШтрихкодовAndroidКлиент
6 |
7 |
8 | ru
9 | Менеджер сканера штрихкодов android клиент
10 |
11 |
12 |
13 | false
14 | true
15 | false
16 | false
17 | false
18 | false
19 | false
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonModules/МенеджерСканераШтрихкодовAndroidКлиент/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
2 | // (с) Tolkachev Pavel, 2020
3 | //
4 | // Licensed under the Apache License, Version 2.0 (the "License");
5 | // you may not use this file except in compliance with the License.
6 | // You may obtain a copy of the License at
7 | //
8 | // http://www.apache.org/licenses/LICENSE-2.0
9 | //
10 | // Unless required by applicable law or agreed to in writing, software
11 | // distributed under the License is distributed on an "AS IS" BASIS,
12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | // See the License for the specific language governing permissions and
14 | // limitations under the License.
15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
16 |
17 | #Область ПрограммныйИнтерфейс
18 |
19 | Функция ЕстьНеобработанноеСобытие() Экспорт
20 |
21 | Возврат Не глПараметрыСканераШтрихкодовAndroid.СобытиеОбработано;
22 |
23 | КонецФункции
24 |
25 | Процедура НачатьУстановкуДрайвера(ОповещениеОЗавершении = Неопределено) Экспорт
26 |
27 | НачатьУстановкуВнешнейКомпоненты(ОповещениеОЗавершении, МестоположениеДрайвера());
28 |
29 | КонецПроцедуры
30 |
31 | Процедура НачатьПодключениеДрайвера(ОповещениеОЗавершении = Неопределено) Экспорт
32 |
33 | НачатьПодключениеВнешнейКомпоненты(
34 | ОповещениеОЗавершении,
35 | МестоположениеДрайвера(),
36 | "com_ptolkachev_AndroidScannerExtension",
37 | ТипВнешнейКомпоненты.Native);
38 |
39 | КонецПроцедуры
40 |
41 | Процедура ОбработатьСобытие(Источник, Событие, Данные) Экспорт
42 |
43 | Если Источник = "com_ptolkachev_AndroidScanner" И Событие = "Штрихкод" Тогда
44 |
45 | ИмяСобытия = "ScanData";
46 |
47 | Штрихкод = СокрЛП(Данные);
48 |
49 | МассивВторогоПорядка = Новый Массив;
50 | МассивВторогоПорядка.Добавить(Данные);
51 | МассивВторогоПорядка.Добавить(Штрихкод);
52 | МассивВторогоПорядка.Добавить(0);
53 |
54 | МассивМассивов = Новый Массив;
55 | МассивМассивов.Добавить(Штрихкод);
56 | МассивМассивов.Добавить(МассивВторогоПорядка);
57 |
58 | Оповестить("ScanData", МассивМассивов, "ПодключаемоеОборудование");
59 |
60 | КонецЕсли;
61 |
62 | КонецПроцедуры
63 |
64 | Процедура Отключить(ИдентификаторКлиента) Экспорт
65 |
66 | Если глПараметрыСканераШтрихкодовAndroid.Сканер = Неопределено Тогда
67 | Возврат;
68 | КонецЕсли;
69 |
70 | Клиент = глПараметрыСканераШтрихкодовAndroid.Сканер.Клиенты.Найти(ИдентификаторКлиента);
71 | Если Клиент = Неопределено Тогда
72 | Возврат;
73 | КонецЕсли;
74 |
75 | КоличествоПодключенных = глПараметрыСканераШтрихкодовAndroid.Сканер.КоличествоПодключенных;
76 |
77 | Если КоличествоПодключенных = 1 Тогда
78 | Оповещение = Новый ОписаниеОповещения("ОтключениеЗавершение", ЭтотОбъект);
79 | глПараметрыСканераШтрихкодовAndroid.Сканер.ОбъектДрайвера.НачатьВызовОтключить(Оповещение, "");
80 | Иначе
81 | глПараметрыСканераШтрихкодовAndroid.Сканер.Клиенты.Удалить(Клиент);
82 | глПараметрыСканераШтрихкодовAndroid.Сканер.КоличествоПодключенных = КоличествоПодключенных - 1;
83 | КонецЕсли;
84 |
85 | КонецПроцедуры
86 |
87 | Процедура Подключить(ИдентификаторКлиента) Экспорт
88 |
89 | ОчиститьСообщения();
90 |
91 | Если Не глПараметрыСканераШтрихкодовAndroid.УстройствоИспользуется Тогда
92 | Возврат;
93 | КонецЕсли;
94 |
95 | Если глПараметрыСканераШтрихкодовAndroid.Сканер = Неопределено Тогда
96 | Оповещение = Новый ОписаниеОповещения("ПодключениеЗавершение", ЭтотОбъект, ИдентификаторКлиента);
97 | НачатьПолучениеОбъектаДрайвера(Оповещение);
98 | Иначе
99 | глПараметрыСканераШтрихкодовAndroid.Сканер.Клиенты.Добавить(ИдентификаторКлиента);
100 |
101 | КоличествоПодключенных = глПараметрыСканераШтрихкодовAndroid.Сканер.КоличествоПодключенных;
102 | глПараметрыСканераШтрихкодовAndroid.Сканер.КоличествоПодключенных = КоличествоПодключенных + 1;
103 | КонецЕсли;
104 |
105 | КонецПроцедуры
106 |
107 | Функция ПреобразоватьДанныеСоСканераВМассив(Параметр) Экспорт
108 |
109 | глПараметрыСканераШтрихкодовAndroid.СобытиеОбработано = Истина;
110 |
111 | Данные = Новый Массив;
112 | Данные.Добавить(ПреобразоватьДанныеСоСканераВСтруктуру(Параметр));
113 |
114 | Возврат Данные;
115 |
116 | КонецФункции
117 |
118 | Функция ПреобразоватьДанныеСоСканераВСтруктуру(Параметр) Экспорт
119 |
120 | глПараметрыСканераШтрихкодовAndroid.СобытиеОбработано = Истина;
121 |
122 | Если Параметр[1] = Неопределено Тогда
123 | Данные = Новый Структура("Штрихкод, Количество", Параметр[0], 1); // Достаем штрихкод из основных данных
124 | Иначе
125 | Данные = Новый Структура("Штрихкод, Количество", Параметр[1][1], 1); // Достаем штрихкод из дополнительных данных
126 | КонецЕсли;
127 |
128 | Возврат Данные;
129 |
130 | КонецФункции
131 |
132 | // Устанавливает параметры сканера в глобальную переменную "глПараметрыСканераШтрихкодовAndroid" модуля приложения для
133 | // кеширования.
134 | //
135 | Процедура УстановитьПараметрыСканера() Экспорт
136 |
137 | глПараметрыСканераШтрихкодовAndroid = МенеджерСканераШтрихкодовAndroidВызовСервера.ПолучитьПараметрыСканера();
138 |
139 | КонецПроцедуры
140 |
141 | #КонецОбласти
142 |
143 | #Область СлужебныеПроцедурыИФункции
144 |
145 | Процедура ИнициализироватьУстройство(КонтекстПодключения)
146 |
147 | ИдУстройства = "";
148 | Оповещение = Новый ОписаниеОповещения("ИнициализироватьУстройствоЗавершение", ЭтотОбъект, КонтекстПодключения);
149 | КонтекстПодключения.ОбъектДрайвера.НачатьВызовПодключить(Оповещение, ИдУстройства);
150 |
151 | КонецПроцедуры
152 |
153 | Процедура ИнициализироватьУстройствоЗавершение(РезультатВыполнения, ПараметрыВызова, КонтекстПодключения) Экспорт
154 |
155 | Клиенты = Новый Массив;
156 | Клиенты.Добавить(КонтекстПодключения.ИдентификаторКлиента);
157 |
158 | Сканер = Новый Структура;
159 | Сканер.Вставить("Клиенты", Клиенты);
160 | Сканер.Вставить("КоличествоПодключенных", 1);
161 | Сканер.Вставить("ОбъектДрайвера", КонтекстПодключения.ОбъектДрайвера);
162 |
163 | глПараметрыСканераШтрихкодовAndroid.Сканер = Сканер;
164 |
165 | КонецПроцедуры
166 |
167 | Функция МестоположениеДрайвера()
168 |
169 | Возврат "ОбщийМакет.ДрайверСканераШтрихкодовAndroid";
170 |
171 | КонецФункции
172 |
173 | Процедура НачатьПолучениеОбъектаДрайвера(ОповещениеОЗавершении)
174 |
175 | ОповещениеОПолученииДрайвера = Новый ОписаниеОповещения(
176 | "ПолучениеОбъектаДрайвераЗавершение",
177 | ЭтотОбъект,
178 | ОповещениеОЗавершении);
179 | НачатьПодключениеДрайвера(ОповещениеОПолученииДрайвера);
180 |
181 | КонецПроцедуры
182 |
183 | Процедура ОтключениеЗавершение(РезультатВыполнения, ПараметрВызова, ДопПараметры) Экспорт
184 |
185 | глПараметрыСканераШтрихкодовAndroid.Сканер = Неопределено;
186 |
187 | КонецПроцедуры
188 |
189 | Процедура ПодключениеЗавершение(ОбъектДрайвера, ИдентификаторКлиента) Экспорт
190 |
191 | Если ОбъектДрайвера = Неопределено Тогда
192 | Возврат;
193 | КонецЕсли;
194 |
195 | Параметры = Новый Структура;
196 | Параметры.Вставить("ActionName", глПараметрыСканераШтрихкодовAndroid.ActionName);
197 | Параметры.Вставить("ExtraData", глПараметрыСканераШтрихкодовAndroid.ExtraData);
198 |
199 | МассивПараметров = Новый Массив;
200 | МассивПараметров.Добавить(Новый Структура(
201 | "ИмяПараметра, Значение",
202 | "ActionName", глПараметрыСканераШтрихкодовAndroid.ActionName));
203 | МассивПараметров.Добавить(Новый Структура(
204 | "ИмяПараметра, Значение",
205 | "ExtraData", глПараметрыСканераШтрихкодовAndroid.ExtraData));
206 |
207 | КонтекстПодключения = Новый Структура;
208 | КонтекстПодключения.Вставить("Параметры", МассивПараметров);
209 | КонтекстПодключения.Вставить("ТекущийПараметр", 0);
210 | КонтекстПодключения.Вставить("ИдентификаторКлиента", ИдентификаторКлиента);
211 | КонтекстПодключения.Вставить("ОбъектДрайвера", ОбъектДрайвера);
212 |
213 | УстановкаПараметраСканераЗавершение(Истина, Неопределено, КонтекстПодключения);
214 |
215 | КонецПроцедуры
216 |
217 | Процедура ПолучениеОбъектаДрайвераЗавершение(Подключено, ОповещениеОЗавершении) Экспорт
218 |
219 | Если Не Подключено Тогда
220 | Сообщение = Новый СообщениеПользователю;
221 | Сообщение.Текст = НСтр("ru='Ошибка при подключении драйвера сканера штрихкодов Android. Сканирование не доступно.'");
222 | Сообщение.Сообщить();
223 |
224 | ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Неопределено);
225 | Возврат;
226 | КонецЕсли;
227 |
228 | Попытка
229 | ProgID = "AddIn.com_ptolkachev_AndroidScannerExtension.com_ptolkachev_AndroidScannerExtension";
230 | ОбъектДрайвера = Новый(ProgID);
231 | ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, ОбъектДрайвера);
232 | Исключение
233 | ТекстОшибки = СтрШаблон(
234 | НСтр("ru='Ошибка при подключении драйвера сканера штрихкодов Android: %1. Сканирование не доступно.'"),
235 | КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
236 |
237 | Сообщение = Новый СообщениеПользователю;
238 | Сообщение.Текст = ТекстОшибки;
239 | Сообщение.Сообщить();
240 |
241 | ВыполнитьОбработкуОповещения(ОповещениеОЗавершении, Неопределено);
242 | КонецПопытки;
243 |
244 | КонецПроцедуры
245 |
246 | Процедура УстановкаПараметраСканераЗавершение(РезультатВыполнения, ПараметрВызова, КонтекстПодключения) Экспорт
247 |
248 | ВсеПараметрыУстановлены = (КонтекстПодключения.ТекущийПараметр = КонтекстПодключения.Параметры.Количество());
249 | Если ВсеПараметрыУстановлены Тогда
250 | ИнициализироватьУстройство(КонтекстПодключения);
251 | Возврат;
252 | КонецЕсли;
253 |
254 | Параметр = КонтекстПодключения.Параметры[КонтекстПодключения.ТекущийПараметр];
255 | КонтекстПодключения.ТекущийПараметр = КонтекстПодключения.ТекущийПараметр + 1;
256 |
257 | Оповещение = Новый ОписаниеОповещения("УстановкаПараметраСканераЗавершение", ЭтотОбъект, КонтекстПодключения);
258 | КонтекстПодключения.ОбъектДрайвера.НачатьВызовУстановитьПараметр(
259 | Оповещение, Параметр.ИмяПараметра, Параметр.Значение);
260 |
261 | КонецПроцедуры
262 |
263 | #КонецОбласти
264 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonTemplates/ДрайверСканераШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ДрайверСканераШтрихкодовAndroid
6 |
7 |
8 | ru
9 | Драйвер сканера штрихкодов android
10 |
11 |
12 |
13 | AddIn
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ScannerLibMA/CommonTemplates/ДрайверСканераШтрихкодовAndroid/Ext/Template.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ltfriend/AndroidScannerDriverFor1C/5ec417a11cefdcb1e8aa24460d8b3d4b4965ed76/ScannerLibMA/CommonTemplates/ДрайверСканераШтрихкодовAndroid/Ext/Template.bin
--------------------------------------------------------------------------------
/ScannerLibMA/ConfigDumpInfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/ScannerLibMA/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | 07173653-be11-4f37-af26-4dc8c02bc7ec
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | 48a3f36e-a6da-4480-9429-b86f0593532c
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | 0231d45c-a956-418c-b4de-bf10cdd5652c
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | abf0d7e1-d4e4-4dcc-ae9a-85daf6d9bb3d
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | 90acc467-6aca-44ff-8473-9e43a1369158
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | c09d948d-566c-45d7-9611-e3bcfbded25f
28 |
29 |
30 | fb282519-d103-4dd3-bc12-cb271d631dfc
31 | 99d45246-a4da-4046-8e61-506f14150501
32 |
33 |
34 |
35 | БиблиотекаСканеровAndroid
36 |
37 |
38 | ru
39 | Библиотека сканеров Android
40 |
41 |
42 |
43 |
44 | Version8_3_24
45 | ManagedApplication
46 |
47 | MobilePlatformApplication
48 |
49 | Russian
50 |
51 | Толкачев П.В.
52 | 1.0.1.2
53 |
54 | false
55 | false
56 | false
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | Biometrics
79 | true
80 |
81 |
82 | Location
83 | false
84 |
85 |
86 | BackgroundLocation
87 | false
88 |
89 |
90 | BluetoothPrinters
91 | false
92 |
93 |
94 | WiFiPrinters
95 | false
96 |
97 |
98 | Contacts
99 | false
100 |
101 |
102 | Calendars
103 | false
104 |
105 |
106 | PushNotifications
107 | false
108 |
109 |
110 | LocalNotifications
111 | false
112 |
113 |
114 | InAppPurchases
115 | false
116 |
117 |
118 | PersonalComputerFileExchange
119 | false
120 |
121 |
122 | Ads
123 | false
124 |
125 |
126 | NumberDialing
127 | false
128 |
129 |
130 | CallProcessing
131 | false
132 |
133 |
134 | CallLog
135 | false
136 |
137 |
138 | AutoSendSMS
139 | false
140 |
141 |
142 | ReceiveSMS
143 | false
144 |
145 |
146 | SMSLog
147 | false
148 |
149 |
150 | Camera
151 | false
152 |
153 |
154 | Microphone
155 | false
156 |
157 |
158 | MusicLibrary
159 | false
160 |
161 |
162 | PictureAndVideoLibraries
163 | false
164 |
165 |
166 | AudioPlaybackAndVibration
167 | false
168 |
169 |
170 | BackgroundAudioPlaybackAndVibration
171 | false
172 |
173 |
174 | InstallPackages
175 | false
176 |
177 |
178 | OSBackup
179 | false
180 |
181 |
182 | ApplicationUsageStatistics
183 | false
184 |
185 |
186 | BarcodeScanning
187 | false
188 |
189 |
190 | BackgroundAudioRecording
191 | false
192 |
193 |
194 | AllFilesAccess
195 | false
196 |
197 |
198 | Videoconferences
199 | false
200 |
201 |
202 | NFC
203 | false
204 |
205 |
206 | DocumentScanning
207 | false
208 |
209 |
210 | SpeechToText
211 | false
212 |
213 |
214 | Geofences
215 | false
216 |
217 |
218 | IncomingShareRequests
219 | false
220 |
221 |
222 | AllIncomingShareRequestsTypesProcessing
223 | false
224 |
225 |
226 |
227 |
228 |
229 | Normal
230 |
231 |
232 | Language.Русский
233 |
234 |
235 | ru
236 | Библиотека сканеров Android для мобильного приложения
237 |
238 |
239 |
240 |
241 | ru
242 | Библиотека сканеров Android для мобильного приложения
243 |
244 |
245 |
246 |
247 | ru
248 | (с) Толкачев П.В., 2020-2024
249 |
250 |
251 |
252 |
253 | ru
254 | https://1cdevelop.ru
255 |
256 |
257 |
258 | Managed
259 | NotAutoFree
260 | DontUse
261 | DontUse
262 | Taxi
263 | DontUse
264 | Version8_3_17
265 |
266 |
267 |
268 | Русский
269 | СканерШтрихкодовAndroid
270 | ДрайверСканераШтрихкодовAndroid
271 | МенеджерСканераШтрихкодовAndroidВызовСервера
272 | МенеджерСканераШтрихкодовAndroidКлиент
273 | НастройкаСканераШтрихкодовAndroid
274 | ДрайверСканераШтрихкодовAndroidУстановлен
275 | ИспользоватьСканерШтрихкодовAndroid
276 | ПараметрыСканераШтрихкодовAndroid
277 | НастройкаДрайвераСканераШтрихкодовAndroid
278 |
279 |
280 |
--------------------------------------------------------------------------------
/ScannerLibMA/Constants/ДрайверСканераШтрихкодовAndroidУстановлен.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | be88ba34-a637-4604-bbec-ffcc3f136f21
7 | 3c1e0ec1-474a-470e-b6ad-42455fd2cfd3
8 |
9 |
10 | 38928fe9-f41d-4740-b5ce-b27edcb7a8da
11 | ff4db8c7-e759-4cb4-bebf-f5f242ac37a7
12 |
13 |
14 | 5a28074a-bb4d-4917-b0ff-2e3f71423661
15 | 6a48a299-c2d2-49fd-91ad-d4ba157efbbf
16 |
17 |
18 |
19 | ДрайверСканераШтрихкодовAndroidУстановлен
20 |
21 |
22 | ru
23 | Драйвер сканера штрихкодов Android установлен
24 |
25 |
26 |
27 |
28 | xs:boolean
29 |
30 | false
31 |
32 |
33 |
34 | false
35 |
36 |
37 |
38 | false
39 |
40 | false
41 | false
42 |
43 |
44 | DontCheck
45 | Items
46 |
47 |
48 | Auto
49 |
50 |
51 | Auto
52 | Managed
53 | DontUse
54 | false
55 | false
56 |
57 |
58 |
--------------------------------------------------------------------------------
/ScannerLibMA/Constants/ИспользоватьСканерШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ec33784f-0a03-4d75-933d-8e3792dee374
7 | aff43095-3d2d-4ff1-9ac2-3506a7bcc742
8 |
9 |
10 | b8cbae26-c530-441f-9e12-5531e24953d3
11 | 5501866c-865d-4047-80d7-8b56f2deac3f
12 |
13 |
14 | 8e9e80ba-b8a0-4c57-9f01-174338aeeabb
15 | 07271171-52f3-4427-9d18-8b4ad6cdf891
16 |
17 |
18 |
19 | ИспользоватьСканерШтрихкодовAndroid
20 |
21 |
22 | ru
23 | Использовать сканер штрихкодов Android
24 |
25 |
26 |
27 |
28 | xs:boolean
29 |
30 | false
31 |
32 |
33 |
34 | false
35 |
36 |
37 |
38 | false
39 |
40 | false
41 | false
42 |
43 |
44 | DontCheck
45 | Items
46 |
47 |
48 | Auto
49 |
50 |
51 | Auto
52 | Managed
53 | DontUse
54 | false
55 | false
56 |
57 |
58 |
--------------------------------------------------------------------------------
/ScannerLibMA/Constants/ПараметрыСканераШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | a227b949-5bbb-46cd-aee4-feb26461a02d
7 | b77c4445-8aba-4531-ae8f-45b9d31e01a4
8 |
9 |
10 | 8cd4f2df-8983-4aaf-a7a6-c86a7b839908
11 | dbeff343-efa9-4839-8d56-4b36cf0ea0f6
12 |
13 |
14 | 11dd5cdb-7cb9-429c-b803-7af7b16577cb
15 | 45486e90-cd8e-42c6-bb79-093a288b77da
16 |
17 |
18 |
19 | ПараметрыСканераШтрихкодовAndroid
20 |
21 |
22 | ru
23 | Параметры сканера штрихкодов Android
24 |
25 |
26 |
27 |
28 | v8:ValueStorage
29 |
30 | false
31 |
32 |
33 |
34 | false
35 |
36 |
37 |
38 | false
39 |
40 | false
41 | false
42 |
43 |
44 | DontCheck
45 | Items
46 |
47 |
48 | Auto
49 |
50 |
51 | Auto
52 | Managed
53 | DontUse
54 | false
55 | false
56 |
57 |
58 |
--------------------------------------------------------------------------------
/ScannerLibMA/Ext/ManagedApplicationModule.bsl:
--------------------------------------------------------------------------------
1 | #Область ОписаниеПеременных
2 |
3 | // СканерШтрихкодовAndroid
4 | Перем глПараметрыСканераШтрихкодовAndroid Экспорт;
5 | // Конец СканерШтрихкодовAndroid
6 |
7 | #КонецОбласти
8 |
9 | #Область ОбработчикиСобытий
10 |
11 | Процедура ПередНачаломРаботыСистемы(Отказ)
12 |
13 | // СканерШтрихкодовAndroid
14 | МенеджерСканераШтрихкодовAndroidКлиент.УстановитьПараметрыСканера();
15 | // Конец СканерШтрихкодовAndroid
16 |
17 | КонецПроцедуры
18 |
19 | Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
20 |
21 | // СканерШтрихкодовAndroid
22 | глПараметрыСканераШтрихкодовAndroid.СобытиеОбработано = Ложь;
23 | МенеджерСканераШтрихкодовAndroidКлиент.ОбработатьСобытие(Источник, Событие, Данные);
24 | // Конец СканерШтрихкодовAndroid
25 |
26 | КонецПроцедуры
27 |
28 | #КонецОбласти
29 |
30 | #Область Инициализация
31 |
32 | // СканерШтрихкодовAndroid
33 | глПараметрыСканераШтрихкодовAndroid = Новый Структура;
34 | // Конец СканерШтрихкодовAndroid
35 |
36 | #КонецОбласти
--------------------------------------------------------------------------------
/ScannerLibMA/Languages/Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 |
7 |
8 | ru
9 | Русский
10 |
11 |
12 |
13 | ru
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ScannerLibMA/Subsystems/СканерШтрихкодовAndroid.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | СканерШтрихкодовAndroid
6 |
7 |
8 | ru
9 | Сканер штрихкодов Android
10 |
11 |
12 |
13 | true
14 | false
15 | false
16 |
17 |
18 |
19 | CommonModule.МенеджерСканераШтрихкодовAndroidВызовСервера
20 | CommonModule.МенеджерСканераШтрихкодовAndroidКлиент
21 | CommonForm.НастройкаДрайвераСканераШтрихкодовAndroid
22 | CommonCommand.НастройкаСканераШтрихкодовAndroid
23 | Constant.ДрайверСканераШтрихкодовAndroidУстановлен
24 | Constant.ПараметрыСканераШтрихкодовAndroid
25 | Constant.ИспользоватьСканерШтрихкодовAndroid
26 | 773199d9-2a30-4480-94b5-e5406182b1e8
27 | CommonTemplate.ДрайверСканераШтрихкодовAndroid
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------