OnGetSignedDocHash

OnGetSignedDocHash

Declaration

Delphi

procedure OnGetSignedDocHash(Hash: OleVariant; out Data: OleVariant; out RetCode: Integer);

ActiveX

HRESULT OnGetSignedDocHash([in] VARIANT Hash, [out] VARIANT* Data, [out] long* RetCode);

 

Description

This function should provide the final document hash to the device driver, read the signed document hash and return it to the API. After the final document hash is provided to the naturaSign signature device, it calculates the signed hash and shows three virtual buttons on the device display: OK, Repeat and Cancel.

The user must either:

  • confirm his signature by pressing OK or

  • request to sign again (Repeat) or

  • cancel the signature process (Cancel).

The computation and confirmation by the user takes some time, and if OnGetSignedDocHash is implemented only in the most simple way (like in the sample below), the application on the PC may freeze for that time. It's often desirable to implement asynchronous polling of the device driver, which should be done by the developer of the client application.

In case you don´t want to use this Hash Dialog, you need to enable the Emulation Mode with SetDriverOptions.

Sample

void axSignAPIv4_OnGetSignedDocHash(object sender, IStepOverSignatureAPIv4Events_OnGetSignedDocHashEvent e) { // return codes; const int adrOk = 0; const int adrError = 1; const int adrCancelled = 2; const int adrRepeat = 3; Cursor.Current = Cursors.WaitCursor; SigDev.SetFinalDocumentHash(e.hash); bool finished = false; while (!finished) { int status; try { e.data = SigDev.GetSignedDocHash(out status); } catch(Exception) { status = 0x03; } // Computation finished and OK pressed? if(status == 0x11) { e.retCode = adrOk; finished = true; } // Cancel or repeat pressed? switch(status & 0x0F) { case 2: e.retCode = adrRepeat; finished = true; break; case 3: e.retCode = adrCancelled; finished = true; break; } Thread.Sleep(50); } Cursor.Current = Cursors.Default; }
procedure TForm1.SignApiGetSignedDocHash(Sender: TObject; Hash: OleVariant; out Data: OleVariant; out RetCode: Integer); var res: TSignProcessResult; DataStr: String; p: TWinControl; begin res := sprError; if StepOverSignatureDevice1.SetFinalDocumentHash(Hash) then begin if CheckBoxDisplayHashDialog.Checked then p := Self else p := nil; case GetSignedDocHashFromDevice(p, VariantToString(Hash), StepOverSignatureDevice1, DataStr) of mrOk: begin if Length(DataStr) > 0 then res := sprOk else res := sprError; end; mrCancel: res := sprCancelled; mrRetry: res := sprRepeat; end; end; Data := StringToVariant(DataStr); RetCode := Integer(res); end;
Private Sub signapi4_OnGetSignedDocHash(ByVal Hash As Object, ByVal Data As Object, ByVal RetCode As Long) ' return codes; Dim adrOk As Integer adrOk = 0 Dim adrError As Integer adrError = 1 Dim adrCancelled As Integer adrCancelled = 2 Dim adrRepeat As Integer adrRepeat = 3 Dim finished As Boolean mSignaturDevice.SetFinalDocumentHash(Hash) finished = False Dim status As Long status = &H3 Do While (Not finished) Data = mSignaturDevice.GetSignedDocHash(status) ' // Computation finished and OK pressed? If status = &H11 Then RetCode = adrOk finished = True End If '// Cancel or repeat pressed? Select Case (status And &HF) Case 2 RetCode = adrRepeat finished = True Case 3 RetCode = adrCancelled finished = True End Select Loop End Sub
Private Sub signapi4_OnGetSignedDocHash(ByVal Hash As Variant, Data As Variant, RetCode As Long) ' return codes; Dim adrOk As Integer adrOk = 0 Dim adrError As Integer adrError = 1 Dim adrCancelled As Integer adrCancelled = 2 Dim adrRepeat As Integer adrRepeat = 3 Dim finished As Boolean sigdev.SetFinalDocumentHash (Hash) finished = False Dim status As Long status = &H3 Do While (Not finished) Data = sigdev.GetSignedDocHash(status) ' // Computation finished and OK pressed? If status = &H11 Then RetCode = adrOk finished = True End If '// Cancel or repeat pressed? Select Case (status And &HF) Case 2 RetCode = adrRepeat finished = True Case 3 RetCode = adrCancelled finished = True End Select Loop End Sub