├── .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 eventclipboard"; 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 |
3 | 4 | <v8:item> 5 | <v8:lang>ru</v8:lang> 6 | <v8:content>Сканер штрихкодов Android</v8:content> 7 | </v8:item> 8 | 9 | false 10 | 11 | 12 | ПриОткрытии 13 | 14 | 15 | 16 | НаборКонстант.ИспользоватьСканерШтрихкодовAndroid 17 | 18 | <v8:item> 19 | <v8:lang>ru</v8:lang> 20 | <v8:content>Использовать сканер штрихкодов</v8:content> 21 | </v8:item> 22 | 23 | Left 24 | Auto 25 | 26 | 27 | 28 | ИспользоватьСканерШтрихкодовAndroidПриИзменении 29 | 30 | 31 | 32 | 33 | <v8:item> 34 | <v8:lang>ru</v8:lang> 35 | <v8:content>Страницы</v8:content> 36 | </v8:item> 37 | 38 | None 39 | 40 | 41 | 42 | 43 | <v8:item> 44 | <v8:lang>ru</v8:lang> 45 | <v8:content>Драйвер получение информации</v8:content> 46 | </v8:item> 47 | 48 | 49 | 50 | 51 | false 52 | 53 | <v8:item> 54 | <v8:lang>ru</v8:lang> 55 | <v8:content>Получение информации о драйвере…</v8:content> 56 | </v8:item> 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | <v8:item> 66 | <v8:lang>ru</v8:lang> 67 | <v8:content>Устройство используется</v8:content> 68 | </v8:item> 69 | 70 | 71 | 72 | 73 | style:SpecialTextColor 74 | 75 | <v8:item> 76 | <v8:lang>ru</v8:lang> 77 | <v8:content>Устройство используется. Перед выполнением операции устройство должно быть отключено.</v8:content> 78 | </v8:item> 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | <v8:item> 88 | <v8:lang>ru</v8:lang> 89 | <v8:content>Драйвер не установлен</v8:content> 90 | </v8:item> 91 | 92 | 93 | 94 | ru 95 | Драйвер не установлен 96 | 97 | 98 | 99 | 100 | 101 | false 102 | style:SpecialTextColor 103 | 104 | <v8:item> 105 | <v8:lang>ru</v8:lang> 106 | <v8:content>Драйвер устройства на текущем рабочем месте не установлен.</v8:content> 107 | </v8:item> 108 | 109 | Left 110 | 111 | 112 | 113 | 118 | 119 | 120 | 121 | 122 | <v8:item> 123 | <v8:lang>ru</v8:lang> 124 | <v8:content>Драйвер установлен</v8:content> 125 | </v8:item> 126 | 127 | 128 | 129 | ru 130 | Драйвер установлен 131 | 132 | 133 | 134 | 135 | 136 | 137 | <v8:item> 138 | <v8:lang>ru</v8:lang> 139 | <v8:content>Параметры сканера</v8:content> 140 | </v8:item> 141 | 142 | Vertical 143 | 144 | 145 | 146 | ActionName 147 | Top 148 | 149 | 150 | 151 | ActionNameПриИзменении 152 | 153 | 154 | 155 | ExtraData 156 | Top 157 | 158 | 159 | 160 | ExtraDataПриИзменении 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | <v8:item> 174 | <v8:lang>ru</v8:lang> 175 | <v8:content>Набор констант</v8:content> 176 | </v8:item> 177 | 178 | 179 | cfg:ConstantsSet 180 | 181 | true 182 | 183 | НаборКонстант.ДрайверСканераШтрихкодовAndroidУстановлен 184 | НаборКонстант.ИспользоватьСканерШтрихкодовAndroid 185 | 186 | 187 | 188 | 189 | <v8:item> 190 | <v8:lang>ru</v8:lang> 191 | <v8:content>Action name</v8:content> 192 | </v8:item> 193 | 194 | 195 | xs:string 196 | 197 | 0 198 | Variable 199 | 200 | 201 | 202 | 203 | 204 | <v8:item> 205 | <v8:lang>ru</v8:lang> 206 | <v8:content>Extra data</v8:content> 207 | </v8:item> 208 | 209 | 210 | xs:string 211 | 212 | 0 213 | Variable 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | <v8:item> 222 | <v8:lang>ru</v8:lang> 223 | <v8:content>Установить драйвер</v8:content> 224 | </v8:item> 225 | 226 | 227 | 228 | ru 229 | Установить драйвер 230 | 231 | 232 | УстановитьДрайвер 233 | 234 | 235 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------