Hex Artifact Content

Artifact 9641a2fef0bc55bfee8198ef83dda5d178e6c8ff:


0000: 2f 2a 0a 20 2a 20 47 6f 6f 67 6c 65 27 73 20 50  /*. * Google's P
0010: 43 53 43 20 6c 69 62 72 61 72 79 20 72 65 71 75  CSC library requ
0020: 69 72 65 73 20 75 73 20 74 6f 20 77 72 69 74 65  ires us to write
0030: 20 6f 75 72 20 6d 6f 64 75 6c 65 20 69 6e 20 43   our module in C
0040: 2b 2b 20 28 74 68 61 6e 6b 73 2c 20 47 6f 6f 67  ++ (thanks, Goog
0050: 6c 65 29 0a 20 2a 20 54 68 69 73 20 6c 69 62 72  le). * This libr
0060: 61 72 79 20 77 72 61 70 73 20 74 68 65 20 61 63  ary wraps the ac
0070: 74 75 61 6c 20 6c 69 62 72 61 72 79 2c 20 77 72  tual library, wr
0080: 69 74 74 65 6e 20 69 6e 20 43 2e 0a 20 2a 2f 0a  itten in C.. */.
0090: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 68 72 65 61  .#include <threa
00a0: 64 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 70 61  d>.#include <ppa
00b0: 70 69 2f 63 70 70 2f 69 6e 73 74 61 6e 63 65 2e  pi/cpp/instance.
00c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 70 61  h>.#include <ppa
00d0: 70 69 2f 63 70 70 2f 6d 6f 64 75 6c 65 2e 68 3e  pi/cpp/module.h>
00e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 70 61 70 69  .#include <ppapi
00f0: 2f 63 70 70 2f 63 6f 72 65 2e 68 3e 0a 23 69 6e  /cpp/core.h>.#in
0100: 63 6c 75 64 65 20 3c 70 70 61 70 69 2f 63 70 70  clude <ppapi/cpp
0110: 2f 76 61 72 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  /var.h>.#include
0120: 20 3c 70 70 61 70 69 2f 63 70 70 2f 76 61 72 5f   <ppapi/cpp/var_
0130: 64 69 63 74 69 6f 6e 61 72 79 2e 68 3e 0a 23 69  dictionary.h>.#i
0140: 6e 63 6c 75 64 65 20 3c 70 70 61 70 69 2f 63 70  nclude <ppapi/cp
0150: 70 2f 76 61 72 5f 61 72 72 61 79 2e 68 3e 0a 23  p/var_array.h>.#
0160: 69 6e 63 6c 75 64 65 20 3c 70 70 61 70 69 2f 63  include <ppapi/c
0170: 70 70 2f 76 61 72 5f 61 72 72 61 79 5f 62 75 66  pp/var_array_buf
0180: 66 65 72 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65  fer.h>..#include
0190: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 6e 63   <stdio.h>..#inc
01a0: 6c 75 64 65 20 22 70 63 73 63 2d 6e 61 63 6c 2e  lude "pcsc-nacl.
01b0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63  h".#include "cac
01c0: 6b 65 79 2d 63 68 72 6f 6d 65 2e 68 22 0a 0a 63  key-chrome.h"..c
01d0: 6c 61 73 73 20 43 41 43 4b 65 79 49 6e 73 74 61  lass CACKeyInsta
01e0: 6e 63 65 20 3a 20 70 75 62 6c 69 63 20 70 70 3a  nce : public pp:
01f0: 3a 49 6e 73 74 61 6e 63 65 20 7b 0a 09 70 72 69  :Instance {..pri
0200: 76 61 74 65 3a 0a 09 09 76 6f 69 64 20 70 63 73  vate:...void pcs
0210: 63 4e 61 43 6c 49 6e 69 74 57 72 61 70 70 65 72  cNaClInitWrapper
0220: 28 70 70 3a 3a 43 6f 72 65 20 2a 63 6f 72 65 29  (pp::Core *core)
0230: 20 7b 0a 09 09 09 66 70 72 69 6e 74 66 28 73 74   {....fprintf(st
0240: 64 65 72 72 2c 20 22 43 61 6c 6c 69 6e 67 20 70  derr, "Calling p
0250: 63 73 63 4e 61 43 6c 49 6e 69 74 28 25 70 2c 20  cscNaClInit(%p, 
0260: 25 70 29 5c 6e 22 2c 20 74 68 69 73 2c 20 63 6f  %p)\n", this, co
0270: 72 65 29 3b 0a 0a 09 09 09 70 63 73 63 4e 61 43  re);.....pcscNaC
0280: 6c 49 6e 69 74 28 74 68 69 73 2c 20 63 6f 72 65  lInit(this, core
0290: 29 3b 0a 0a 09 09 09 66 70 72 69 6e 74 66 28 73  );.....fprintf(s
02a0: 74 64 65 72 72 2c 20 22 70 63 73 63 4e 61 43 6c  tderr, "pcscNaCl
02b0: 49 6e 69 74 20 74 65 72 6d 69 6e 61 74 65 64 5c  Init terminated\
02c0: 6e 22 29 3b 0a 09 09 7d 0a 09 70 75 62 6c 69 63  n");...}..public
02d0: 3a 0a 09 09 65 78 70 6c 69 63 69 74 20 43 41 43  :...explicit CAC
02e0: 4b 65 79 49 6e 73 74 61 6e 63 65 28 50 50 5f 49  KeyInstance(PP_I
02f0: 6e 73 74 61 6e 63 65 20 69 6e 73 74 61 6e 63 65  nstance instance
0300: 2c 20 70 70 3a 3a 43 6f 72 65 20 2a 63 6f 72 65  , pp::Core *core
0310: 29 20 3a 20 70 70 3a 3a 49 6e 73 74 61 6e 63 65  ) : pp::Instance
0320: 28 69 6e 73 74 61 6e 63 65 29 20 7b 0a 09 09 09  (instance) {....
0330: 73 74 64 3a 3a 74 68 72 65 61 64 28 26 43 41 43  std::thread(&CAC
0340: 4b 65 79 49 6e 73 74 61 6e 63 65 3a 3a 70 63 73  KeyInstance::pcs
0350: 63 4e 61 43 6c 49 6e 69 74 57 72 61 70 70 65 72  cNaClInitWrapper
0360: 2c 20 74 68 69 73 2c 20 63 6f 72 65 29 2e 64 65  , this, core).de
0370: 74 61 63 68 28 29 3b 0a 09 09 7d 0a 0a 09 09 76  tach();...}....v
0380: 69 72 74 75 61 6c 20 7e 43 41 43 4b 65 79 49 6e  irtual ~CACKeyIn
0390: 73 74 61 6e 63 65 28 29 20 7b 7d 0a 0a 09 09 76  stance() {}....v
03a0: 69 72 74 75 61 6c 20 76 6f 69 64 20 48 61 6e 64  irtual void Hand
03b0: 6c 65 4d 65 73 73 61 67 65 54 68 72 65 61 64 28  leMessageThread(
03c0: 70 70 3a 3a 56 61 72 44 69 63 74 69 6f 6e 61 72  pp::VarDictionar
03d0: 79 20 2a 6d 65 73 73 61 67 65 29 20 7b 0a 09 09  y *message) {...
03e0: 09 69 6e 74 20 6e 75 6d 43 65 72 74 69 66 69 63  .int numCertific
03f0: 61 74 65 73 2c 20 69 3b 0a 09 09 09 73 74 72 75  ates, i;....stru
0400: 63 74 20 63 61 63 6b 65 79 5f 63 65 72 74 69 66  ct cackey_certif
0410: 69 63 61 74 65 20 2a 63 65 72 74 69 66 69 63 61  icate *certifica
0420: 74 65 73 3b 0a 09 09 09 70 70 3a 3a 56 61 72 44  tes;....pp::VarD
0430: 69 63 74 69 6f 6e 61 72 79 20 2a 72 65 70 6c 79  ictionary *reply
0440: 3b 0a 09 09 09 70 70 3a 3a 56 61 72 41 72 72 61  ;....pp::VarArra
0450: 79 20 63 65 72 74 69 66 69 63 61 74 65 73 50 50  y certificatesPP
0460: 41 72 72 61 79 3b 0a 09 09 09 70 70 3a 3a 56 61  Array;....pp::Va
0470: 72 41 72 72 61 79 42 75 66 66 65 72 20 2a 63 65  rArrayBuffer *ce
0480: 72 74 69 66 69 63 61 74 65 43 6f 6e 74 65 6e 74  rtificateContent
0490: 73 3b 0a 09 09 09 70 70 3a 3a 56 61 72 20 63 6f  s;....pp::Var co
04a0: 6d 6d 61 6e 64 3b 0a 0a 09 09 09 2f 2a 0a 09 09  mmand;...../*...
04b0: 09 20 2a 20 45 78 74 72 61 63 74 20 74 68 65 20  . * Extract the 
04c0: 63 6f 6d 6d 61 6e 64 0a 09 09 09 20 2a 2f 0a 09  command.... */..
04d0: 09 09 63 6f 6d 6d 61 6e 64 20 3d 20 6d 65 73 73  ..command = mess
04e0: 61 67 65 2d 3e 47 65 74 28 22 63 6f 6d 6d 61 6e  age->Get("comman
04f0: 64 22 29 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20  d");...../*.... 
0500: 2a 20 44 6f 20 74 68 65 20 74 68 69 6e 67 20 77  * Do the thing w
0510: 65 20 61 72 65 20 62 65 69 6e 67 20 61 73 6b 65  e are being aske
0520: 64 20 74 6f 20 64 6f 0a 09 09 09 20 2a 2f 0a 09  d to do.... */..
0530: 09 09 69 66 20 28 63 6f 6d 6d 61 6e 64 2e 41 73  ..if (command.As
0540: 53 74 72 69 6e 67 28 29 20 3d 3d 20 22 6c 69 73  String() == "lis
0550: 74 63 65 72 74 69 66 69 63 61 74 65 73 22 29 20  tcertificates") 
0560: 7b 0a 09 09 09 09 6e 75 6d 43 65 72 74 69 66 69  {.....numCertifi
0570: 63 61 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 63  cates = cackey_c
0580: 68 72 6f 6d 65 5f 6c 69 73 74 43 65 72 74 69 66  hrome_listCertif
0590: 69 63 61 74 65 73 28 26 63 65 72 74 69 66 69 63  icates(&certific
05a0: 61 74 65 73 29 3b 0a 0a 09 09 09 09 72 65 70 6c  ates);......repl
05b0: 79 20 3d 20 6e 65 77 20 70 70 3a 3a 56 61 72 44  y = new pp::VarD
05c0: 69 63 74 69 6f 6e 61 72 79 28 29 3b 0a 0a 09 09  ictionary();....
05d0: 09 09 63 65 72 74 69 66 69 63 61 74 65 73 50 50  ..certificatesPP
05e0: 41 72 72 61 79 2e 53 65 74 4c 65 6e 67 74 68 28  Array.SetLength(
05f0: 6e 75 6d 43 65 72 74 69 66 69 63 61 74 65 73 29  numCertificates)
0600: 3b 0a 0a 09 09 09 09 66 6f 72 20 28 69 20 3d 20  ;......for (i = 
0610: 30 3b 20 69 20 3c 20 6e 75 6d 43 65 72 74 69 66  0; i < numCertif
0620: 69 63 61 74 65 73 3b 20 69 2b 2b 29 20 7b 0a 09  icates; i++) {..
0630: 09 09 09 09 63 65 72 74 69 66 69 63 61 74 65 43  ....certificateC
0640: 6f 6e 74 65 6e 74 73 20 3d 20 6e 65 77 20 70 70  ontents = new pp
0650: 3a 3a 56 61 72 41 72 72 61 79 42 75 66 66 65 72  ::VarArrayBuffer
0660: 28 63 65 72 74 69 66 69 63 61 74 65 73 5b 69 5d  (certificates[i]
0670: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
0680: 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  );.......memcpy(
0690: 63 65 72 74 69 66 69 63 61 74 65 43 6f 6e 74 65  certificateConte
06a0: 6e 74 73 2d 3e 4d 61 70 28 29 2c 20 63 65 72 74  nts->Map(), cert
06b0: 69 66 69 63 61 74 65 73 5b 69 5d 2e 63 65 72 74  ificates[i].cert
06c0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
06d0: 63 61 74 65 73 5b 69 5d 2e 63 65 72 74 69 66 69  cates[i].certifi
06e0: 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
06f0: 09 63 65 72 74 69 66 69 63 61 74 65 43 6f 6e 74  .certificateCont
0700: 65 6e 74 73 2d 3e 55 6e 6d 61 70 28 29 3b 0a 0a  ents->Unmap();..
0710: 09 09 09 09 09 63 65 72 74 69 66 69 63 61 74 65  .....certificate
0720: 73 50 50 41 72 72 61 79 2e 53 65 74 28 69 2c 20  sPPArray.Set(i, 
0730: 2a 63 65 72 74 69 66 69 63 61 74 65 43 6f 6e 74  *certificateCont
0740: 65 6e 74 73 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  ents);.....}....
0750: 09 09 72 65 70 6c 79 2d 3e 53 65 74 28 22 73 74  ..reply->Set("st
0760: 61 74 75 73 22 2c 20 22 73 75 63 63 65 73 73 22  atus", "success"
0770: 29 3b 0a 09 09 09 09 72 65 70 6c 79 2d 3e 53 65  );.....reply->Se
0780: 74 28 22 63 65 72 74 69 66 69 63 61 74 65 73 22  t("certificates"
0790: 2c 20 63 65 72 74 69 66 69 63 61 74 65 73 50 50  , certificatesPP
07a0: 41 72 72 61 79 29 3b 0a 09 09 09 7d 20 65 6c 73  Array);....} els
07b0: 65 20 69 66 20 28 63 6f 6d 6d 61 6e 64 2e 41 73  e if (command.As
07c0: 53 74 72 69 6e 67 28 29 20 3d 3d 20 22 73 69 67  String() == "sig
07d0: 6e 22 29 20 7b 0a 09 09 09 09 72 65 70 6c 79 20  n") {.....reply 
07e0: 3d 20 6e 65 77 20 70 70 3a 3a 56 61 72 44 69 63  = new pp::VarDic
07f0: 74 69 6f 6e 61 72 79 28 29 3b 0a 0a 09 09 09 09  tionary();......
0800: 72 65 70 6c 79 2d 3e 53 65 74 28 22 73 74 61 74  reply->Set("stat
0810: 75 73 22 2c 20 22 73 75 63 63 65 73 73 22 29 3b  us", "success");
0820: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
0830: 09 72 65 70 6c 79 20 3d 20 6e 65 77 20 70 70 3a  .reply = new pp:
0840: 3a 56 61 72 44 69 63 74 69 6f 6e 61 72 79 28 29  :VarDictionary()
0850: 3b 0a 0a 09 09 09 09 72 65 70 6c 79 2d 3e 53 65  ;......reply->Se
0860: 74 28 22 73 74 61 74 75 73 22 2c 20 22 65 72 72  t("status", "err
0870: 6f 72 22 29 3b 0a 09 09 09 09 72 65 70 6c 79 2d  or");.....reply-
0880: 3e 53 65 74 28 22 65 72 72 6f 72 22 2c 20 22 49  >Set("error", "I
0890: 6e 76 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 22 29  nvalid command")
08a0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09  ;....}...../*...
08b0: 09 20 2a 20 49 66 20 61 20 6d 65 73 73 61 67 65  . * If a message
08c0: 20 49 44 20 77 61 73 20 73 65 6e 74 20 69 6e 20   ID was sent in 
08d0: 74 68 65 20 72 65 71 75 65 73 74 2c 20 69 6e 63  the request, inc
08e0: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 72  lude it in the r
08f0: 65 70 6c 79 0a 09 09 09 20 2a 2f 0a 09 09 09 69  eply.... */....i
0900: 66 20 28 6d 65 73 73 61 67 65 2d 3e 48 61 73 4b  f (message->HasK
0910: 65 79 28 22 69 64 22 29 29 20 7b 0a 09 09 09 09  ey("id")) {.....
0920: 72 65 70 6c 79 2d 3e 53 65 74 28 22 69 64 22 2c  reply->Set("id",
0930: 20 6d 65 73 73 61 67 65 2d 3e 47 65 74 28 22 69   message->Get("i
0940: 64 22 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  d"));....}...../
0950: 2a 0a 09 09 09 20 2a 20 53 65 6e 64 20 74 68 65  *.... * Send the
0960: 20 72 65 70 6c 79 20 62 61 63 6b 20 74 6f 20 74   reply back to t
0970: 68 65 20 72 65 71 75 65 73 74 6f 72 2c 20 68 6f  he requestor, ho
0980: 70 65 66 75 6c 6c 79 20 74 68 65 79 20 61 72 65  pefully they are
0990: 20 77 61 69 74 69 6e 67 20 66 6f 72 20 74 68 69   waiting for thi
09a0: 73 20 6d 65 73 73 61 67 65 0a 09 09 09 20 2a 2f  s message.... */
09b0: 0a 09 09 09 50 6f 73 74 4d 65 73 73 61 67 65 28  ....PostMessage(
09c0: 2a 72 65 70 6c 79 29 3b 0a 0a 09 09 09 64 65 6c  *reply);.....del
09d0: 65 74 65 20 6d 65 73 73 61 67 65 3b 0a 0a 09 09  ete message;....
09e0: 09 72 65 74 75 72 6e 3b 0a 09 09 7d 0a 0a 09 09  .return;...}....
09f0: 76 69 72 74 75 61 6c 20 76 6f 69 64 20 48 61 6e  virtual void Han
0a00: 64 6c 65 4d 65 73 73 61 67 65 28 63 6f 6e 73 74  dleMessage(const
0a10: 20 70 70 3a 3a 56 61 72 26 20 6d 65 73 73 61 67   pp::Var& messag
0a20: 65 50 6c 61 69 6e 29 20 7b 0a 09 09 09 70 70 3a  ePlain) {....pp:
0a30: 3a 56 61 72 44 69 63 74 69 6f 6e 61 72 79 20 2a  :VarDictionary *
0a40: 6d 65 73 73 61 67 65 3b 0a 09 09 09 70 70 3a 3a  message;....pp::
0a50: 56 61 72 20 74 61 72 67 65 74 3b 0a 0a 09 09 09  Var target;.....
0a60: 2f 2a 0a 09 09 09 20 2a 20 54 68 65 20 69 6e 63  /*.... * The inc
0a70: 6f 6d 69 6e 67 20 6d 65 73 73 61 67 65 20 6d 75  oming message mu
0a80: 73 74 20 62 65 20 61 20 64 69 63 74 69 6f 6e 61  st be a dictiona
0a90: 72 79 0a 09 09 09 20 2a 2f 0a 09 09 09 69 66 20  ry.... */....if 
0aa0: 28 21 6d 65 73 73 61 67 65 50 6c 61 69 6e 2e 69  (!messagePlain.i
0ab0: 73 5f 64 69 63 74 69 6f 6e 61 72 79 28 29 29 20  s_dictionary()) 
0ac0: 7b 0a 09 09 09 09 70 63 73 63 4e 61 43 6c 48 61  {.....pcscNaClHa
0ad0: 6e 64 6c 65 4d 65 73 73 61 67 65 28 6d 65 73 73  ndleMessage(mess
0ae0: 61 67 65 50 6c 61 69 6e 29 3b 0a 0a 09 09 09 09  agePlain);......
0af0: 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09  return;....}....
0b00: 09 2f 2a 0a 09 09 09 20 2a 20 50 72 6f 63 65 73  ./*.... * Proces
0b10: 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
0b20: 65 20 63 6f 6d 6d 61 6e 64 20 66 72 6f 6d 20 74  e command from t
0b30: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 65 73 73  he incoming mess
0b40: 61 67 65 0a 09 09 09 20 2a 2f 0a 09 09 09 6d 65  age.... */....me
0b50: 73 73 61 67 65 20 3d 20 6e 65 77 20 70 70 3a 3a  ssage = new pp::
0b60: 56 61 72 44 69 63 74 69 6f 6e 61 72 79 28 6d 65  VarDictionary(me
0b70: 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a 0a 09 09  ssagePlain);....
0b80: 09 2f 2a 0a 09 09 09 20 2a 20 56 65 72 69 66 79  ./*.... * Verify
0b90: 20 74 68 61 74 20 74 68 69 73 20 6d 65 73 73 61   that this messa
0ba0: 67 65 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ge is destined f
0bb0: 6f 72 20 75 73 0a 09 09 09 20 2a 2f 0a 09 09 09  or us.... */....
0bc0: 69 66 20 28 21 6d 65 73 73 61 67 65 2d 3e 48 61  if (!message->Ha
0bd0: 73 4b 65 79 28 22 74 61 72 67 65 74 22 29 29 20  sKey("target")) 
0be0: 7b 0a 09 09 09 09 64 65 6c 65 74 65 20 6d 65 73  {.....delete mes
0bf0: 73 61 67 65 3b 0a 0a 09 09 09 09 70 63 73 63 4e  sage;......pcscN
0c00: 61 43 6c 48 61 6e 64 6c 65 4d 65 73 73 61 67 65  aClHandleMessage
0c10: 28 6d 65 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a  (messagePlain);.
0c20: 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09  .....return;....
0c30: 7d 0a 0a 09 09 09 74 61 72 67 65 74 20 3d 20 6d  }.....target = m
0c40: 65 73 73 61 67 65 2d 3e 47 65 74 28 22 74 61 72  essage->Get("tar
0c50: 67 65 74 22 29 3b 0a 09 09 09 69 66 20 28 74 61  get");....if (ta
0c60: 72 67 65 74 2e 41 73 53 74 72 69 6e 67 28 29 20  rget.AsString() 
0c70: 21 3d 20 22 63 61 63 6b 65 79 22 29 20 7b 0a 09  != "cackey") {..
0c80: 09 09 09 64 65 6c 65 74 65 20 6d 65 73 73 61 67  ...delete messag
0c90: 65 3b 0a 0a 09 09 09 09 70 63 73 63 4e 61 43 6c  e;......pcscNaCl
0ca0: 48 61 6e 64 6c 65 4d 65 73 73 61 67 65 28 6d 65  HandleMessage(me
0cb0: 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a 0a 09 09  ssagePlain);....
0cc0: 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a  ..return;....}..
0cd0: 09 09 09 2f 2a 0a 09 09 09 20 2a 20 44 65 74 65  .../*.... * Dete
0ce0: 72 6d 69 6e 65 20 77 68 61 74 20 77 65 20 61 72  rmine what we ar
0cf0: 65 20 62 65 69 6e 67 20 61 73 6b 65 64 20 74 6f  e being asked to
0d00: 20 64 6f 0a 09 09 09 20 2a 2f 0a 09 09 09 69 66   do.... */....if
0d10: 20 28 21 6d 65 73 73 61 67 65 2d 3e 48 61 73 4b   (!message->HasK
0d20: 65 79 28 22 63 6f 6d 6d 61 6e 64 22 29 29 20 7b  ey("command")) {
0d30: 0a 09 09 09 09 64 65 6c 65 74 65 20 6d 65 73 73  .....delete mess
0d40: 61 67 65 3b 0a 0a 09 09 09 09 70 63 73 63 4e 61  age;......pcscNa
0d50: 43 6c 48 61 6e 64 6c 65 4d 65 73 73 61 67 65 28  ClHandleMessage(
0d60: 6d 65 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a 0a  messagePlain);..
0d70: 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d  ....return;....}
0d80: 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 50 72  ...../*.... * Pr
0d90: 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73  ocess the reques
0da0: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 68 72  t in another thr
0db0: 65 61 64 0a 09 09 09 20 2a 2f 0a 09 09 09 73 74  ead.... */....st
0dc0: 64 3a 3a 74 68 72 65 61 64 28 26 43 41 43 4b 65  d::thread(&CACKe
0dd0: 79 49 6e 73 74 61 6e 63 65 3a 3a 48 61 6e 64 6c  yInstance::Handl
0de0: 65 4d 65 73 73 61 67 65 54 68 72 65 61 64 2c 20  eMessageThread, 
0df0: 74 68 69 73 2c 20 6d 65 73 73 61 67 65 29 2e 64  this, message).d
0e00: 65 74 61 63 68 28 29 3b 0a 0a 09 09 09 72 65 74  etach();.....ret
0e10: 75 72 6e 3b 0a 09 09 7d 0a 7d 3b 0a 0a 63 6c 61  urn;...}.};..cla
0e20: 73 73 20 43 41 43 4b 65 79 4d 6f 64 75 6c 65 20  ss CACKeyModule 
0e30: 3a 20 70 75 62 6c 69 63 20 70 70 3a 3a 4d 6f 64  : public pp::Mod
0e40: 75 6c 65 20 7b 0a 09 70 75 62 6c 69 63 3a 0a 09  ule {..public:..
0e50: 09 43 41 43 4b 65 79 4d 6f 64 75 6c 65 28 29 20  .CACKeyModule() 
0e60: 3a 20 70 70 3a 3a 4d 6f 64 75 6c 65 28 29 20 7b  : pp::Module() {
0e70: 7d 0a 09 09 76 69 72 74 75 61 6c 20 7e 43 41 43  }...virtual ~CAC
0e80: 4b 65 79 4d 6f 64 75 6c 65 28 29 20 7b 7d 0a 0a  KeyModule() {}..
0e90: 09 09 76 69 72 74 75 61 6c 20 70 70 3a 3a 49 6e  ..virtual pp::In
0ea0: 73 74 61 6e 63 65 20 2a 43 72 65 61 74 65 49 6e  stance *CreateIn
0eb0: 73 74 61 6e 63 65 28 50 50 5f 49 6e 73 74 61 6e  stance(PP_Instan
0ec0: 63 65 20 69 6e 73 74 61 6e 63 65 29 20 7b 0a 09  ce instance) {..
0ed0: 09 09 72 65 74 75 72 6e 28 6e 65 77 20 43 41 43  ..return(new CAC
0ee0: 4b 65 79 49 6e 73 74 61 6e 63 65 28 69 6e 73 74  KeyInstance(inst
0ef0: 61 6e 63 65 2c 20 63 6f 72 65 28 29 29 29 3b 0a  ance, core()));.
0f00: 09 09 7d 0a 7d 3b 0a 0a 6e 61 6d 65 73 70 61 63  ..}.};..namespac
0f10: 65 20 70 70 20 7b 0a 09 4d 6f 64 75 6c 65 20 2a  e pp {..Module *
0f20: 43 72 65 61 74 65 4d 6f 64 75 6c 65 28 29 20 7b  CreateModule() {
0f30: 0a 09 09 72 65 74 75 72 6e 28 6e 65 77 20 43 41  ...return(new CA
0f40: 43 4b 65 79 4d 6f 64 75 6c 65 28 29 29 3b 0a 09  CKeyModule());..
0f50: 7d 0a 7d 0a                                      }.}.