Hex Artifact Content

Artifact 50a59eb73f85c29e317d66bf3395cb6a18763dcc:


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 49  }...../*.... * I
0a20: 6e 64 69 63 61 74 65 20 77 68 6f 20 6f 75 72 20  ndicate who our 
0a30: 6d 65 73 73 61 67 65 20 69 73 20 66 6f 72 0a 09  message is for..
0a40: 09 09 20 2a 2f 0a 09 09 09 72 65 70 6c 79 2d 3e  .. */....reply->
0a50: 53 65 74 28 22 74 61 72 67 65 74 22 2c 20 22 63  Set("target", "c
0a60: 61 63 6b 65 79 22 29 3b 0a 09 09 09 72 65 70 6c  ackey");....repl
0a70: 79 2d 3e 53 65 74 28 22 63 6f 6d 6d 61 6e 64 22  y->Set("command"
0a80: 2c 20 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 09  , command);.....
0a90: 2f 2a 0a 09 09 09 20 2a 20 53 65 6e 64 20 74 68  /*.... * Send th
0aa0: 65 20 72 65 70 6c 79 20 62 61 63 6b 20 74 6f 20  e reply back to 
0ab0: 74 68 65 20 72 65 71 75 65 73 74 6f 72 2c 20 68  the requestor, h
0ac0: 6f 70 65 66 75 6c 6c 79 20 74 68 65 79 20 61 72  opefully they ar
0ad0: 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20 74 68  e waiting for th
0ae0: 69 73 20 6d 65 73 73 61 67 65 0a 09 09 09 20 2a  is message.... *
0af0: 2f 0a 09 09 09 50 6f 73 74 4d 65 73 73 61 67 65  /....PostMessage
0b00: 28 2a 72 65 70 6c 79 29 3b 0a 0a 09 09 09 64 65  (*reply);.....de
0b10: 6c 65 74 65 20 72 65 70 6c 79 3b 0a 0a 09 09 09  lete reply;.....
0b20: 64 65 6c 65 74 65 20 6d 65 73 73 61 67 65 3b 0a  delete message;.
0b30: 0a 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 7d 0a  ....return;...}.
0b40: 0a 09 09 76 69 72 74 75 61 6c 20 76 6f 69 64 20  ...virtual void 
0b50: 48 61 6e 64 6c 65 4d 65 73 73 61 67 65 28 63 6f  HandleMessage(co
0b60: 6e 73 74 20 70 70 3a 3a 56 61 72 26 20 6d 65 73  nst pp::Var& mes
0b70: 73 61 67 65 50 6c 61 69 6e 29 20 7b 0a 09 09 09  sagePlain) {....
0b80: 70 70 3a 3a 56 61 72 44 69 63 74 69 6f 6e 61 72  pp::VarDictionar
0b90: 79 20 2a 6d 65 73 73 61 67 65 3b 0a 09 09 09 70  y *message;....p
0ba0: 70 3a 3a 56 61 72 20 74 61 72 67 65 74 3b 0a 0a  p::Var target;..
0bb0: 09 09 09 2f 2a 0a 09 09 09 20 2a 20 54 68 65 20  .../*.... * The 
0bc0: 69 6e 63 6f 6d 69 6e 67 20 6d 65 73 73 61 67 65  incoming message
0bd0: 20 6d 75 73 74 20 62 65 20 61 20 64 69 63 74 69   must be a dicti
0be0: 6f 6e 61 72 79 0a 09 09 09 20 2a 2f 0a 09 09 09  onary.... */....
0bf0: 69 66 20 28 21 6d 65 73 73 61 67 65 50 6c 61 69  if (!messagePlai
0c00: 6e 2e 69 73 5f 64 69 63 74 69 6f 6e 61 72 79 28  n.is_dictionary(
0c10: 29 29 20 7b 0a 09 09 09 09 70 63 73 63 4e 61 43  )) {.....pcscNaC
0c20: 6c 48 61 6e 64 6c 65 4d 65 73 73 61 67 65 28 6d  lHandleMessage(m
0c30: 65 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a 0a 09  essagePlain);...
0c40: 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09 7d 0a  ...return;....}.
0c50: 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 50 72 6f  ..../*.... * Pro
0c60: 63 65 73 73 20 74 68 65 20 61 70 70 72 6f 70 72  cess the appropr
0c70: 69 61 74 65 20 63 6f 6d 6d 61 6e 64 20 66 72 6f  iate command fro
0c80: 6d 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d  m the incoming m
0c90: 65 73 73 61 67 65 0a 09 09 09 20 2a 2f 0a 09 09  essage.... */...
0ca0: 09 6d 65 73 73 61 67 65 20 3d 20 6e 65 77 20 70  .message = new p
0cb0: 70 3a 3a 56 61 72 44 69 63 74 69 6f 6e 61 72 79  p::VarDictionary
0cc0: 28 6d 65 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a  (messagePlain);.
0cd0: 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 56 65 72  ..../*.... * Ver
0ce0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 6d 65  ify that this me
0cf0: 73 73 61 67 65 20 69 73 20 64 65 73 74 69 6e 65  ssage is destine
0d00: 64 20 66 6f 72 20 75 73 0a 09 09 09 20 2a 2f 0a  d for us.... */.
0d10: 09 09 09 69 66 20 28 21 6d 65 73 73 61 67 65 2d  ...if (!message-
0d20: 3e 48 61 73 4b 65 79 28 22 74 61 72 67 65 74 22  >HasKey("target"
0d30: 29 29 20 7b 0a 09 09 09 09 64 65 6c 65 74 65 20  )) {.....delete 
0d40: 6d 65 73 73 61 67 65 3b 0a 0a 09 09 09 09 70 63  message;......pc
0d50: 73 63 4e 61 43 6c 48 61 6e 64 6c 65 4d 65 73 73  scNaClHandleMess
0d60: 61 67 65 28 6d 65 73 73 61 67 65 50 6c 61 69 6e  age(messagePlain
0d70: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a  );......return;.
0d80: 09 09 09 7d 0a 0a 09 09 09 74 61 72 67 65 74 20  ...}.....target 
0d90: 3d 20 6d 65 73 73 61 67 65 2d 3e 47 65 74 28 22  = message->Get("
0da0: 74 61 72 67 65 74 22 29 3b 0a 09 09 09 69 66 20  target");....if 
0db0: 28 74 61 72 67 65 74 2e 41 73 53 74 72 69 6e 67  (target.AsString
0dc0: 28 29 20 21 3d 20 22 63 61 63 6b 65 79 22 29 20  () != "cackey") 
0dd0: 7b 0a 09 09 09 09 64 65 6c 65 74 65 20 6d 65 73  {.....delete mes
0de0: 73 61 67 65 3b 0a 0a 09 09 09 09 70 63 73 63 4e  sage;......pcscN
0df0: 61 43 6c 48 61 6e 64 6c 65 4d 65 73 73 61 67 65  aClHandleMessage
0e00: 28 6d 65 73 73 61 67 65 50 6c 61 69 6e 29 3b 0a  (messagePlain);.
0e10: 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09 09 09  .....return;....
0e20: 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a 20 44  }...../*.... * D
0e30: 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 77 65  etermine what we
0e40: 20 61 72 65 20 62 65 69 6e 67 20 61 73 6b 65 64   are being asked
0e50: 20 74 6f 20 64 6f 0a 09 09 09 20 2a 2f 0a 09 09   to do.... */...
0e60: 09 69 66 20 28 21 6d 65 73 73 61 67 65 2d 3e 48  .if (!message->H
0e70: 61 73 4b 65 79 28 22 63 6f 6d 6d 61 6e 64 22 29  asKey("command")
0e80: 29 20 7b 0a 09 09 09 09 64 65 6c 65 74 65 20 6d  ) {.....delete m
0e90: 65 73 73 61 67 65 3b 0a 0a 09 09 09 09 70 63 73  essage;......pcs
0ea0: 63 4e 61 43 6c 48 61 6e 64 6c 65 4d 65 73 73 61  cNaClHandleMessa
0eb0: 67 65 28 6d 65 73 73 61 67 65 50 6c 61 69 6e 29  ge(messagePlain)
0ec0: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 3b 0a 09  ;......return;..
0ed0: 09 09 7d 0a 0a 09 09 09 2f 2a 0a 09 09 09 20 2a  ..}...../*.... *
0ee0: 20 50 72 6f 63 65 73 73 20 74 68 65 20 72 65 71   Process the req
0ef0: 75 65 73 74 20 69 6e 20 61 6e 6f 74 68 65 72 20  uest in another 
0f00: 74 68 72 65 61 64 0a 09 09 09 20 2a 2f 0a 09 09  thread.... */...
0f10: 09 73 74 64 3a 3a 74 68 72 65 61 64 28 26 43 41  .std::thread(&CA
0f20: 43 4b 65 79 49 6e 73 74 61 6e 63 65 3a 3a 48 61  CKeyInstance::Ha
0f30: 6e 64 6c 65 4d 65 73 73 61 67 65 54 68 72 65 61  ndleMessageThrea
0f40: 64 2c 20 74 68 69 73 2c 20 6d 65 73 73 61 67 65  d, this, message
0f50: 29 2e 64 65 74 61 63 68 28 29 3b 0a 0a 09 09 09  ).detach();.....
0f60: 72 65 74 75 72 6e 3b 0a 09 09 7d 0a 7d 3b 0a 0a  return;...}.};..
0f70: 63 6c 61 73 73 20 43 41 43 4b 65 79 4d 6f 64 75  class CACKeyModu
0f80: 6c 65 20 3a 20 70 75 62 6c 69 63 20 70 70 3a 3a  le : public pp::
0f90: 4d 6f 64 75 6c 65 20 7b 0a 09 70 75 62 6c 69 63  Module {..public
0fa0: 3a 0a 09 09 43 41 43 4b 65 79 4d 6f 64 75 6c 65  :...CACKeyModule
0fb0: 28 29 20 3a 20 70 70 3a 3a 4d 6f 64 75 6c 65 28  () : pp::Module(
0fc0: 29 20 7b 7d 0a 09 09 76 69 72 74 75 61 6c 20 7e  ) {}...virtual ~
0fd0: 43 41 43 4b 65 79 4d 6f 64 75 6c 65 28 29 20 7b  CACKeyModule() {
0fe0: 7d 0a 0a 09 09 76 69 72 74 75 61 6c 20 70 70 3a  }....virtual pp:
0ff0: 3a 49 6e 73 74 61 6e 63 65 20 2a 43 72 65 61 74  :Instance *Creat
1000: 65 49 6e 73 74 61 6e 63 65 28 50 50 5f 49 6e 73  eInstance(PP_Ins
1010: 74 61 6e 63 65 20 69 6e 73 74 61 6e 63 65 29 20  tance instance) 
1020: 7b 0a 09 09 09 72 65 74 75 72 6e 28 6e 65 77 20  {....return(new 
1030: 43 41 43 4b 65 79 49 6e 73 74 61 6e 63 65 28 69  CACKeyInstance(i
1040: 6e 73 74 61 6e 63 65 2c 20 63 6f 72 65 28 29 29  nstance, core())
1050: 29 3b 0a 09 09 7d 0a 7d 3b 0a 0a 6e 61 6d 65 73  );...}.};..names
1060: 70 61 63 65 20 70 70 20 7b 0a 09 4d 6f 64 75 6c  pace pp {..Modul
1070: 65 20 2a 43 72 65 61 74 65 4d 6f 64 75 6c 65 28  e *CreateModule(
1080: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 65 77  ) {...return(new
1090: 20 43 41 43 4b 65 79 4d 6f 64 75 6c 65 28 29 29   CACKeyModule())
10a0: 3b 0a 09 7d 0a 7d 0a                             ;..}.}.