Hex Artifact Content

Artifact 75e6704a49db9f1ceb665814dedfe9c5c72aeb8e:


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 22 70 63 73 63 2d 6e 61 63 6c 2e 68 22 0a 23   "pcsc-nacl.h".#
01a0: 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 2d  include "cackey-
01b0: 63 68 72 6f 6d 65 2e 68 22 0a 0a 63 6c 61 73 73  chrome.h"..class
01c0: 20 43 41 43 4b 65 79 49 6e 73 74 61 6e 63 65 20   CACKeyInstance 
01d0: 3a 20 70 75 62 6c 69 63 20 70 70 3a 3a 49 6e 73  : public pp::Ins
01e0: 74 61 6e 63 65 20 7b 0a 09 70 72 69 76 61 74 65  tance {..private
01f0: 3a 0a 09 09 76 6f 69 64 20 70 63 73 63 4e 61 43  :...void pcscNaC
0200: 6c 49 6e 69 74 57 72 61 70 70 65 72 28 70 70 3a  lInitWrapper(pp:
0210: 3a 43 6f 72 65 20 2a 63 6f 72 65 29 20 7b 0a 09  :Core *core) {..
0220: 09 09 70 63 73 63 4e 61 43 6c 49 6e 69 74 28 74  ..pcscNaClInit(t
0230: 68 69 73 2c 20 63 6f 72 65 29 3b 0a 09 09 7d 0a  his, core);...}.
0240: 09 70 75 62 6c 69 63 3a 0a 09 09 65 78 70 6c 69  .public:...expli
0250: 63 69 74 20 43 41 43 4b 65 79 49 6e 73 74 61 6e  cit CACKeyInstan
0260: 63 65 28 50 50 5f 49 6e 73 74 61 6e 63 65 20 69  ce(PP_Instance i
0270: 6e 73 74 61 6e 63 65 2c 20 70 70 3a 3a 43 6f 72  nstance, pp::Cor
0280: 65 20 2a 63 6f 72 65 29 20 3a 20 70 70 3a 3a 49  e *core) : pp::I
0290: 6e 73 74 61 6e 63 65 28 69 6e 73 74 61 6e 63 65  nstance(instance
02a0: 29 20 7b 0a 09 09 09 73 74 64 3a 3a 74 68 72 65  ) {....std::thre
02b0: 61 64 28 26 43 41 43 4b 65 79 49 6e 73 74 61 6e  ad(&CACKeyInstan
02c0: 63 65 3a 3a 70 63 73 63 4e 61 43 6c 49 6e 69 74  ce::pcscNaClInit
02d0: 57 72 61 70 70 65 72 2c 20 74 68 69 73 2c 20 63  Wrapper, this, c
02e0: 6f 72 65 29 2e 64 65 74 61 63 68 28 29 3b 0a 09  ore).detach();..
02f0: 09 7d 0a 0a 09 09 76 69 72 74 75 61 6c 20 7e 43  .}....virtual ~C
0300: 41 43 4b 65 79 49 6e 73 74 61 6e 63 65 28 29 20  ACKeyInstance() 
0310: 7b 7d 0a 0a 09 09 76 69 72 74 75 61 6c 20 76 6f  {}....virtual vo
0320: 69 64 20 48 61 6e 64 6c 65 4d 65 73 73 61 67 65  id HandleMessage
0330: 54 68 72 65 61 64 28 70 70 3a 3a 56 61 72 44 69  Thread(pp::VarDi
0340: 63 74 69 6f 6e 61 72 79 20 2a 6d 65 73 73 61 67  ctionary *messag
0350: 65 29 20 7b 0a 09 09 09 69 6e 74 20 6e 75 6d 43  e) {....int numC
0360: 65 72 74 69 66 69 63 61 74 65 73 2c 20 69 3b 0a  ertificates, i;.
0370: 09 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ...struct cackey
0380: 5f 63 65 72 74 69 66 69 63 61 74 65 20 2a 63 65  _certificate *ce
0390: 72 74 69 66 69 63 61 74 65 73 3b 0a 09 09 09 70  rtificates;....p
03a0: 70 3a 3a 56 61 72 44 69 63 74 69 6f 6e 61 72 79  p::VarDictionary
03b0: 20 2a 72 65 70 6c 79 3b 0a 09 09 09 70 70 3a 3a   *reply;....pp::
03c0: 56 61 72 41 72 72 61 79 20 63 65 72 74 69 66 69  VarArray certifi
03d0: 63 61 74 65 73 50 50 41 72 72 61 79 3b 0a 09 09  catesPPArray;...
03e0: 09 70 70 3a 3a 56 61 72 41 72 72 61 79 42 75 66  .pp::VarArrayBuf
03f0: 66 65 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  fer *certificate
0400: 43 6f 6e 74 65 6e 74 73 3b 0a 09 09 09 70 70 3a  Contents;....pp:
0410: 3a 56 61 72 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e  :Var command, in
0420: 63 6f 6d 69 6e 67 43 65 72 74 69 66 69 63 61 74  comingCertificat
0430: 65 43 6f 6e 74 65 6e 74 73 3b 0a 0a 09 09 09 2f  eContents;...../
0440: 2a 0a 09 09 09 20 2a 20 45 78 74 72 61 63 74 20  *.... * Extract 
0450: 74 68 65 20 63 6f 6d 6d 61 6e 64 0a 09 09 09 20  the command.... 
0460: 2a 2f 0a 09 09 09 63 6f 6d 6d 61 6e 64 20 3d 20  */....command = 
0470: 6d 65 73 73 61 67 65 2d 3e 47 65 74 28 22 63 6f  message->Get("co
0480: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 09 09 2f 2a 0a  mmand");...../*.
0490: 09 09 09 20 2a 20 44 6f 20 74 68 65 20 74 68 69  ... * Do the thi
04a0: 6e 67 20 77 65 20 61 72 65 20 62 65 69 6e 67 20  ng we are being 
04b0: 61 73 6b 65 64 20 74 6f 20 64 6f 0a 09 09 09 20  asked to do.... 
04c0: 2a 2f 0a 09 09 09 72 65 70 6c 79 20 3d 20 6e 65  */....reply = ne
04d0: 77 20 70 70 3a 3a 56 61 72 44 69 63 74 69 6f 6e  w pp::VarDiction
04e0: 61 72 79 28 29 3b 0a 0a 09 09 09 69 66 20 28 63  ary();.....if (c
04f0: 6f 6d 6d 61 6e 64 2e 41 73 53 74 72 69 6e 67 28  ommand.AsString(
0500: 29 20 3d 3d 20 22 6c 69 73 74 63 65 72 74 69 66  ) == "listcertif
0510: 69 63 61 74 65 73 22 29 20 7b 0a 09 09 09 09 6e  icates") {.....n
0520: 75 6d 43 65 72 74 69 66 69 63 61 74 65 73 20 3d  umCertificates =
0530: 20 63 61 63 6b 65 79 5f 63 68 72 6f 6d 65 5f 6c   cackey_chrome_l
0540: 69 73 74 43 65 72 74 69 66 69 63 61 74 65 73 28  istCertificates(
0550: 26 63 65 72 74 69 66 69 63 61 74 65 73 29 3b 0a  &certificates);.
0560: 0a 09 09 09 09 63 65 72 74 69 66 69 63 61 74 65  .....certificate
0570: 73 50 50 41 72 72 61 79 2e 53 65 74 4c 65 6e 67  sPPArray.SetLeng
0580: 74 68 28 6e 75 6d 43 65 72 74 69 66 69 63 61 74  th(numCertificat
0590: 65 73 29 3b 0a 0a 09 09 09 09 66 6f 72 20 28 69  es);......for (i
05a0: 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 43 65 72   = 0; i < numCer
05b0: 74 69 66 69 63 61 74 65 73 3b 20 69 2b 2b 29 20  tificates; i++) 
05c0: 7b 0a 09 09 09 09 09 63 65 72 74 69 66 69 63 61  {......certifica
05d0: 74 65 43 6f 6e 74 65 6e 74 73 20 3d 20 6e 65 77  teContents = new
05e0: 20 70 70 3a 3a 56 61 72 41 72 72 61 79 42 75 66   pp::VarArrayBuf
05f0: 66 65 72 28 63 65 72 74 69 66 69 63 61 74 65 73  fer(certificates
0600: 5b 69 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  [i].certificate_
0610: 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63  len);.......memc
0620: 70 79 28 63 65 72 74 69 66 69 63 61 74 65 43 6f  py(certificateCo
0630: 6e 74 65 6e 74 73 2d 3e 4d 61 70 28 29 2c 20 63  ntents->Map(), c
0640: 65 72 74 69 66 69 63 61 74 65 73 5b 69 5d 2e 63  ertificates[i].c
0650: 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
0660: 69 66 69 63 61 74 65 73 5b 69 5d 2e 63 65 72 74  ificates[i].cert
0670: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
0680: 09 09 09 09 63 65 72 74 69 66 69 63 61 74 65 43  ....certificateC
0690: 6f 6e 74 65 6e 74 73 2d 3e 55 6e 6d 61 70 28 29  ontents->Unmap()
06a0: 3b 0a 0a 09 09 09 09 09 63 65 72 74 69 66 69 63  ;.......certific
06b0: 61 74 65 73 50 50 41 72 72 61 79 2e 53 65 74 28  atesPPArray.Set(
06c0: 69 2c 20 2a 63 65 72 74 69 66 69 63 61 74 65 43  i, *certificateC
06d0: 6f 6e 74 65 6e 74 73 29 3b 0a 0a 09 09 09 09 09  ontents);.......
06e0: 64 65 6c 65 74 65 20 63 65 72 74 69 66 69 63 61  delete certifica
06f0: 74 65 43 6f 6e 74 65 6e 74 73 3b 0a 09 09 09 09  teContents;.....
0700: 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 63 68  }......cackey_ch
0710: 72 6f 6d 65 5f 66 72 65 65 43 65 72 74 69 66 69  rome_freeCertifi
0720: 63 61 74 65 73 28 63 65 72 74 69 66 69 63 61 74  cates(certificat
0730: 65 73 2c 20 6e 75 6d 43 65 72 74 69 66 69 63 61  es, numCertifica
0740: 74 65 73 29 3b 0a 0a 09 09 09 09 72 65 70 6c 79  tes);......reply
0750: 2d 3e 53 65 74 28 22 73 74 61 74 75 73 22 2c 20  ->Set("status", 
0760: 22 73 75 63 63 65 73 73 22 29 3b 0a 09 09 09 09  "success");.....
0770: 72 65 70 6c 79 2d 3e 53 65 74 28 22 63 65 72 74  reply->Set("cert
0780: 69 66 69 63 61 74 65 73 22 2c 20 63 65 72 74 69  ificates", certi
0790: 66 69 63 61 74 65 73 50 50 41 72 72 61 79 29 3b  ficatesPPArray);
07a0: 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63  ....} else if (c
07b0: 6f 6d 6d 61 6e 64 2e 41 73 53 74 72 69 6e 67 28  ommand.AsString(
07c0: 29 20 3d 3d 20 22 73 69 67 6e 22 29 20 7b 0a 09  ) == "sign") {..
07d0: 09 09 09 69 66 20 28 21 6d 65 73 73 61 67 65 2d  ...if (!message-
07e0: 3e 48 61 73 4b 65 79 28 22 63 65 72 74 69 66 69  >HasKey("certifi
07f0: 63 61 74 65 22 29 29 20 7b 0a 09 09 09 09 09 72  cate")) {......r
0800: 65 70 6c 79 2d 3e 53 65 74 28 22 73 74 61 74 75  eply->Set("statu
0810: 73 22 2c 20 22 65 72 72 6f 72 22 29 3b 0a 09 09  s", "error");...
0820: 09 09 09 72 65 70 6c 79 2d 3e 53 65 74 28 22 65  ...reply->Set("e
0830: 72 72 6f 72 22 2c 20 22 43 65 72 74 69 66 69 63  rror", "Certific
0840: 61 74 65 20 6e 6f 74 20 73 75 70 70 6c 69 65 64  ate not supplied
0850: 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ");.....} else {
0860: 0a 09 09 09 09 09 69 6e 63 6f 6d 69 6e 67 43 65  ......incomingCe
0870: 72 74 69 66 69 63 61 74 65 43 6f 6e 74 65 6e 74  rtificateContent
0880: 73 20 3d 20 6d 65 73 73 61 67 65 2d 3e 47 65 74  s = message->Get
0890: 28 22 63 65 72 74 69 66 69 63 61 74 65 22 29 3b  ("certificate");
08a0: 0a 0a 09 09 09 09 09 72 65 70 6c 79 2d 3e 53 65  .......reply->Se
08b0: 74 28 22 73 74 61 74 75 73 22 2c 20 22 65 72 72  t("status", "err
08c0: 6f 72 22 29 3b 0a 09 09 09 09 09 72 65 70 6c 79  or");......reply
08d0: 2d 3e 53 65 74 28 22 65 72 72 6f 72 22 2c 20 22  ->Set("error", "
08e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
08f0: 20 6e 6f 74 20 79 65 74 20 69 6d 70 6c 65 6d 65   not yet impleme
0900: 6e 74 65 64 22 29 3b 0a 09 09 09 09 7d 0a 09 09  nted");.....}...
0910: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 72 65  .} else {.....re
0920: 70 6c 79 2d 3e 53 65 74 28 22 73 74 61 74 75 73  ply->Set("status
0930: 22 2c 20 22 65 72 72 6f 72 22 29 3b 0a 09 09 09  ", "error");....
0940: 09 72 65 70 6c 79 2d 3e 53 65 74 28 22 65 72 72  .reply->Set("err
0950: 6f 72 22 2c 20 22 49 6e 76 61 6c 69 64 20 63 6f  or", "Invalid co
0960: 6d 6d 61 6e 64 22 29 3b 0a 09 09 09 7d 0a 0a 09  mmand");....}...
0970: 09 09 2f 2a 0a 09 09 09 20 2a 20 49 66 20 61 20  ../*.... * If a 
0980: 6d 65 73 73 61 67 65 20 49 44 20 77 61 73 20 73  message ID was s
0990: 65 6e 74 20 69 6e 20 74 68 65 20 72 65 71 75 65  ent in the reque
09a0: 73 74 2c 20 69 6e 63 6c 75 64 65 20 69 74 20 69  st, include it i
09b0: 6e 20 74 68 65 20 72 65 70 6c 79 0a 09 09 09 20  n the reply.... 
09c0: 2a 2f 0a 09 09 09 69 66 20 28 6d 65 73 73 61 67  */....if (messag
09d0: 65 2d 3e 48 61 73 4b 65 79 28 22 69 64 22 29 29  e->HasKey("id"))
09e0: 20 7b 0a 09 09 09 09 72 65 70 6c 79 2d 3e 53 65   {.....reply->Se
09f0: 74 28 22 69 64 22 2c 20 6d 65 73 73 61 67 65 2d  t("id", message-
0a00: 3e 47 65 74 28 22 69 64 22 29 29 3b 0a 09 09 09  >Get("id"));....
0a10: 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 53  }...../*.... * S
0a20: 65 6e 64 20 74 68 65 20 72 65 70 6c 79 20 62 61  end the reply ba
0a30: 63 6b 20 74 6f 20 74 68 65 20 72 65 71 75 65 73  ck to the reques
0a40: 74 6f 72 2c 20 68 6f 70 65 66 75 6c 6c 79 20 74  tor, hopefully t
0a50: 68 65 79 20 61 72 65 20 77 61 69 74 69 6e 67 20  hey are waiting 
0a60: 66 6f 72 20 74 68 69 73 20 6d 65 73 73 61 67 65  for this message
0a70: 0a 09 09 09 20 2a 2f 0a 09 09 09 50 6f 73 74 4d  .... */....PostM
0a80: 65 73 73 61 67 65 28 2a 72 65 70 6c 79 29 3b 0a  essage(*reply);.
0a90: 0a 09 09 09 64 65 6c 65 74 65 20 72 65 70 6c 79  ....delete reply
0aa0: 3b 0a 0a 09 09 09 64 65 6c 65 74 65 20 6d 65 73  ;.....delete mes
0ab0: 73 61 67 65 3b 0a 0a 09 09 09 72 65 74 75 72 6e  sage;.....return
0ac0: 3b 0a 09 09 7d 0a 0a 09 09 76 69 72 74 75 61 6c  ;...}....virtual
0ad0: 20 76 6f 69 64 20 48 61 6e 64 6c 65 4d 65 73 73   void HandleMess
0ae0: 61 67 65 28 63 6f 6e 73 74 20 70 70 3a 3a 56 61  age(const pp::Va
0af0: 72 26 20 6d 65 73 73 61 67 65 50 6c 61 69 6e 29  r& messagePlain)
0b00: 20 7b 0a 09 09 09 70 70 3a 3a 56 61 72 44 69 63   {....pp::VarDic
0b10: 74 69 6f 6e 61 72 79 20 2a 6d 65 73 73 61 67 65  tionary *message
0b20: 3b 0a 09 09 09 70 70 3a 3a 56 61 72 20 74 61 72  ;....pp::Var tar
0b30: 67 65 74 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09 20  get;...../*.... 
0b40: 2a 20 54 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d  * The incoming m
0b50: 65 73 73 61 67 65 20 6d 75 73 74 20 62 65 20 61  essage must be a
0b60: 20 64 69 63 74 69 6f 6e 61 72 79 0a 09 09 09 20   dictionary.... 
0b70: 2a 2f 0a 09 09 09 69 66 20 28 21 6d 65 73 73 61  */....if (!messa
0b80: 67 65 50 6c 61 69 6e 2e 69 73 5f 64 69 63 74 69  gePlain.is_dicti
0b90: 6f 6e 61 72 79 28 29 29 20 7b 0a 09 09 09 09 70  onary()) {.....p
0ba0: 63 73 63 4e 61 43 6c 48 61 6e 64 6c 65 4d 65 73  cscNaClHandleMes
0bb0: 73 61 67 65 28 6d 65 73 73 61 67 65 50 6c 61 69  sage(messagePlai
0bc0: 6e 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 3b  n);......return;
0bd0: 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09  ....}...../*....
0be0: 20 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 61   * Process the a
0bf0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6d 6d 61  ppropriate comma
0c00: 6e 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 63 6f  nd from the inco
0c10: 6d 69 6e 67 20 6d 65 73 73 61 67 65 0a 09 09 09  ming message....
0c20: 20 2a 2f 0a 09 09 09 6d 65 73 73 61 67 65 20 3d   */....message =
0c30: 20 6e 65 77 20 70 70 3a 3a 56 61 72 44 69 63 74   new pp::VarDict
0c40: 69 6f 6e 61 72 79 28 6d 65 73 73 61 67 65 50 6c  ionary(messagePl
0c50: 61 69 6e 29 3b 0a 0a 09 09 09 2f 2a 0a 09 09 09  ain);...../*....
0c60: 20 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74   * Verify that t
0c70: 68 69 73 20 6d 65 73 73 61 67 65 20 69 73 20 64  his message is d
0c80: 65 73 74 69 6e 65 64 20 66 6f 72 20 75 73 0a 09  estined for us..
0c90: 09 09 20 2a 2f 0a 09 09 09 69 66 20 28 21 6d 65  .. */....if (!me
0ca0: 73 73 61 67 65 2d 3e 48 61 73 4b 65 79 28 22 74  ssage->HasKey("t
0cb0: 61 72 67 65 74 22 29 29 20 7b 0a 09 09 09 09 64  arget")) {.....d
0cc0: 65 6c 65 74 65 20 6d 65 73 73 61 67 65 3b 0a 0a  elete message;..
0cd0: 09 09 09 09 70 63 73 63 4e 61 43 6c 48 61 6e 64  ....pcscNaClHand
0ce0: 6c 65 4d 65 73 73 61 67 65 28 6d 65 73 73 61 67  leMessage(messag
0cf0: 65 50 6c 61 69 6e 29 3b 0a 0a 09 09 09 09 72 65  ePlain);......re
0d00: 74 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 74  turn;....}.....t
0d10: 61 72 67 65 74 20 3d 20 6d 65 73 73 61 67 65 2d  arget = message-
0d20: 3e 47 65 74 28 22 74 61 72 67 65 74 22 29 3b 0a  >Get("target");.
0d30: 09 09 09 69 66 20 28 74 61 72 67 65 74 2e 41 73  ...if (target.As
0d40: 53 74 72 69 6e 67 28 29 20 21 3d 20 22 63 61 63  String() != "cac
0d50: 6b 65 79 22 29 20 7b 0a 09 09 09 09 64 65 6c 65  key") {.....dele
0d60: 74 65 20 6d 65 73 73 61 67 65 3b 0a 0a 09 09 09  te message;.....
0d70: 09 70 63 73 63 4e 61 43 6c 48 61 6e 64 6c 65 4d  .pcscNaClHandleM
0d80: 65 73 73 61 67 65 28 6d 65 73 73 61 67 65 50 6c  essage(messagePl
0d90: 61 69 6e 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ain);......retur
0da0: 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 0a 09  n;....}...../*..
0db0: 09 09 20 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  .. * Determine w
0dc0: 68 61 74 20 77 65 20 61 72 65 20 62 65 69 6e 67  hat we are being
0dd0: 20 61 73 6b 65 64 20 74 6f 20 64 6f 0a 09 09 09   asked to do....
0de0: 20 2a 2f 0a 09 09 09 69 66 20 28 21 6d 65 73 73   */....if (!mess
0df0: 61 67 65 2d 3e 48 61 73 4b 65 79 28 22 63 6f 6d  age->HasKey("com
0e00: 6d 61 6e 64 22 29 29 20 7b 0a 09 09 09 09 64 65  mand")) {.....de
0e10: 6c 65 74 65 20 6d 65 73 73 61 67 65 3b 0a 0a 09  lete message;...
0e20: 09 09 09 70 63 73 63 4e 61 43 6c 48 61 6e 64 6c  ...pcscNaClHandl
0e30: 65 4d 65 73 73 61 67 65 28 6d 65 73 73 61 67 65  eMessage(message
0e40: 50 6c 61 69 6e 29 3b 0a 0a 09 09 09 09 72 65 74  Plain);......ret
0e50: 75 72 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  urn;....}...../*
0e60: 0a 09 09 09 20 2a 20 50 72 6f 63 65 73 73 20 74  .... * Process t
0e70: 68 65 20 72 65 71 75 65 73 74 20 69 6e 20 61 6e  he request in an
0e80: 6f 74 68 65 72 20 74 68 72 65 61 64 0a 09 09 09  other thread....
0e90: 20 2a 2f 0a 09 09 09 73 74 64 3a 3a 74 68 72 65   */....std::thre
0ea0: 61 64 28 26 43 41 43 4b 65 79 49 6e 73 74 61 6e  ad(&CACKeyInstan
0eb0: 63 65 3a 3a 48 61 6e 64 6c 65 4d 65 73 73 61 67  ce::HandleMessag
0ec0: 65 54 68 72 65 61 64 2c 20 74 68 69 73 2c 20 6d  eThread, this, m
0ed0: 65 73 73 61 67 65 29 2e 64 65 74 61 63 68 28 29  essage).detach()
0ee0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09  ;.....return;...
0ef0: 7d 0a 7d 3b 0a 0a 63 6c 61 73 73 20 43 41 43 4b  }.};..class CACK
0f00: 65 79 4d 6f 64 75 6c 65 20 3a 20 70 75 62 6c 69  eyModule : publi
0f10: 63 20 70 70 3a 3a 4d 6f 64 75 6c 65 20 7b 0a 09  c pp::Module {..
0f20: 70 75 62 6c 69 63 3a 0a 09 09 43 41 43 4b 65 79  public:...CACKey
0f30: 4d 6f 64 75 6c 65 28 29 20 3a 20 70 70 3a 3a 4d  Module() : pp::M
0f40: 6f 64 75 6c 65 28 29 20 7b 7d 0a 09 09 76 69 72  odule() {}...vir
0f50: 74 75 61 6c 20 7e 43 41 43 4b 65 79 4d 6f 64 75  tual ~CACKeyModu
0f60: 6c 65 28 29 20 7b 7d 0a 0a 09 09 76 69 72 74 75  le() {}....virtu
0f70: 61 6c 20 70 70 3a 3a 49 6e 73 74 61 6e 63 65 20  al pp::Instance 
0f80: 2a 43 72 65 61 74 65 49 6e 73 74 61 6e 63 65 28  *CreateInstance(
0f90: 50 50 5f 49 6e 73 74 61 6e 63 65 20 69 6e 73 74  PP_Instance inst
0fa0: 61 6e 63 65 29 20 7b 0a 09 09 09 72 65 74 75 72  ance) {....retur
0fb0: 6e 28 6e 65 77 20 43 41 43 4b 65 79 49 6e 73 74  n(new CACKeyInst
0fc0: 61 6e 63 65 28 69 6e 73 74 61 6e 63 65 2c 20 63  ance(instance, c
0fd0: 6f 72 65 28 29 29 29 3b 0a 09 09 7d 0a 7d 3b 0a  ore()));...}.};.
0fe0: 0a 6e 61 6d 65 73 70 61 63 65 20 70 70 20 7b 0a  .namespace pp {.
0ff0: 09 4d 6f 64 75 6c 65 20 2a 43 72 65 61 74 65 4d  .Module *CreateM
1000: 6f 64 75 6c 65 28 29 20 7b 0a 09 09 72 65 74 75  odule() {...retu
1010: 72 6e 28 6e 65 77 20 43 41 43 4b 65 79 4d 6f 64  rn(new CACKeyMod
1020: 75 6c 65 28 29 29 3b 0a 09 7d 0a 7d 0a           ule());..}.}.