1
zhanghua
2024-09-26 c775c6953d9759e70f08acbfa8f6d7490aaae3d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.netsdk.demo.customize.faceReconEx;
 
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Pointer;
 
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
 
/**
 * @author 47081
 * @version 1.0
 * @description 人脸搜索回调默认实现,回调函数请使用单例模式
 * @date 2021/4/28
 */
public class DefaultFaceFindStateCallback implements NetSDKLib.fFaceFindState {
  private static volatile DefaultFaceFindStateCallback instance;
  // 进度队列
  private static Map<FaceFindHandler, LinkedBlockingQueue<Integer>> progresses = new HashMap<>();
 
  private DefaultFaceFindStateCallback() {}
 
  public static DefaultFaceFindStateCallback getInstance() {
    if (instance == null) {
      synchronized (DefaultFaceFindStateCallback.class) {
        if (instance == null) {
          instance = new DefaultFaceFindStateCallback();
        }
      }
    }
    return instance;
  }
 
  @Override
  public void invoke(
      NetSDKLib.LLong lLoginID,
      NetSDKLib.LLong lAttachHandle,
      Pointer pstStates,
      int nStateNum,
      Pointer dwUser) {
    if (nStateNum < 1) {
      return;
    }
    FaceFindHandler faceFindHandler = new FaceFindHandler();
    LinkedBlockingQueue progress;
    NetSDKLib.NET_CB_FACE_FIND_STATE[] msg = new NetSDKLib.NET_CB_FACE_FIND_STATE[nStateNum];
    for (int i = 0; i < nStateNum; i++) {
      msg[i] = new NetSDKLib.NET_CB_FACE_FIND_STATE();
    }
    ToolKits.GetPointerDataToStructArr(pstStates, msg);
    for (int i = 0; i < nStateNum; i++) {
      faceFindHandler.setLoginHandler(lLoginID.longValue());
      faceFindHandler.setAttachHandler(lAttachHandle.longValue());
      faceFindHandler.setnToken(msg[i].nToken);
      progress = progresses.get(faceFindHandler);
      if (progress == null) {
        progress = new LinkedBlockingQueue();
      }
      progress.add(msg[i].nProgress);
      progresses.put(faceFindHandler, progress);
    }
  }
 
  private class FaceFindHandler {
    private long loginHandler;
    private long attachHandler;
    private long nToken;
 
    public FaceFindHandler() {}
 
    public FaceFindHandler(long loginHandler, long attachHandler, long nToken) {
      this.loginHandler = loginHandler;
      this.attachHandler = attachHandler;
      this.nToken = nToken;
    }
 
    public long getLoginHandler() {
      return loginHandler;
    }
 
    public void setLoginHandler(long loginHandler) {
      this.loginHandler = loginHandler;
    }
 
    public long getAttachHandler() {
      return attachHandler;
    }
 
    public void setAttachHandler(long attachHandler) {
      this.attachHandler = attachHandler;
    }
 
    public long getnToken() {
      return nToken;
    }
 
    public void setnToken(long nToken) {
      this.nToken = nToken;
    }
 
    @Override
    public boolean equals(Object o) {
      if (o == null || getClass() != o.getClass()) return false;
 
      FaceFindHandler that = (FaceFindHandler) o;
 
      if (loginHandler != that.loginHandler) return false;
      if (attachHandler != that.attachHandler) return false;
      return nToken == that.nToken;
    }
 
    @Override
    public int hashCode() {
      int result = (int) (loginHandler ^ (loginHandler >>> 32));
      result = 31 * result + (int) (attachHandler ^ (attachHandler >>> 32));
      result = 31 * result + (int) (nToken ^ (nToken >>> 32));
      return result;
    }
  }
 
  public int getProgress(long loginHandler, long attachHandler, int nToken)
      throws InterruptedException {
    return progresses.get(new FaceFindHandler(loginHandler, attachHandler, nToken)).take();
  }
}