Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: xfa/fxfa/parser/xfa_script_imp.cpp

Issue 1857713003: Rename GetCStr and GetPtr to match CFX_ByteString (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fxfa/parser/xfa_script_imp.h" 7 #include "xfa/fxfa/parser/xfa_script_imp.h"
8 8
9 #include "core/fxcrt/include/fx_ext.h" 9 #include "core/fxcrt/include/fx_ext.h"
10 #include "xfa/fxfa/app/xfa_ffnotify.h" 10 #include "xfa/fxfa/app/xfa_ffnotify.h"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 CFX_WideTextBuf wsJavaScript; 89 CFX_WideTextBuf wsJavaScript;
90 CFX_WideString wsErrorInfo; 90 CFX_WideString wsErrorInfo;
91 int32_t iFlags = XFA_FM2JS_Translate(wsScript, wsJavaScript, wsErrorInfo); 91 int32_t iFlags = XFA_FM2JS_Translate(wsScript, wsJavaScript, wsErrorInfo);
92 if (iFlags) { 92 if (iFlags) {
93 FXJSE_Value_SetUndefined(hRetValue); 93 FXJSE_Value_SetUndefined(hRetValue);
94 return FALSE; 94 return FALSE;
95 } 95 }
96 btScript = 96 btScript =
97 FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength()); 97 FX_UTF8Encode(wsJavaScript.GetBuffer(), wsJavaScript.GetLength());
98 } else { 98 } else {
99 btScript = FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength()); 99 btScript = FX_UTF8Encode(wsScript.raw_str(), wsScript.GetLength());
100 } 100 }
101 CXFA_Object* pOriginalObject = m_pThisObject; 101 CXFA_Object* pOriginalObject = m_pThisObject;
102 m_pThisObject = pThisObject; 102 m_pThisObject = pThisObject;
103 FXJSE_HVALUE pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL; 103 FXJSE_HVALUE pValue = pThisObject ? GetJSValueFromMap(pThisObject) : NULL;
104 FX_BOOL bRet = FXJSE_ExecuteScript(m_hJsContext, btScript, hRetValue, pValue); 104 FX_BOOL bRet = FXJSE_ExecuteScript(m_hJsContext, btScript, hRetValue, pValue);
105 m_pThisObject = pOriginalObject; 105 m_pThisObject = pOriginalObject;
106 m_eScriptType = eSaveType; 106 m_eScriptType = eSaveType;
107 return bRet; 107 return bRet;
108 } 108 }
109 void CXFA_ScriptContext::GlobalPropertySetter(FXJSE_HOBJECT hObject, 109 void CXFA_ScriptContext::GlobalPropertySetter(FXJSE_HOBJECT hObject,
110 const CFX_ByteStringC& szPropName, 110 const CFX_ByteStringC& szPropName,
111 FXJSE_HVALUE hValue) { 111 FXJSE_HVALUE hValue) {
112 CXFA_Object* lpOrginalNode = 112 CXFA_Object* lpOrginalNode =
113 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 113 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
114 CXFA_Document* pDoc = lpOrginalNode->GetDocument(); 114 CXFA_Document* pDoc = lpOrginalNode->GetDocument();
115 CXFA_ScriptContext* lpScriptContext = 115 CXFA_ScriptContext* lpScriptContext =
116 (CXFA_ScriptContext*)pDoc->GetScriptContext(); 116 (CXFA_ScriptContext*)pDoc->GetScriptContext();
117 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode); 117 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(lpOrginalNode);
118 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 118 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
119 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 119 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
120 uint32_t dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings | 120 uint32_t dwFlag = XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings |
121 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | 121 XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
122 XFA_RESOLVENODE_Attributes; 122 XFA_RESOLVENODE_Attributes;
123 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject()); 123 CXFA_Node* pRefNode = ToNode(lpScriptContext->GetThisObject());
124 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) { 124 if (lpOrginalNode->GetObjectType() == XFA_OBJECTTYPE_VariablesThis) {
125 pRefNode = ToNode(lpCurNode); 125 pRefNode = ToNode(lpCurNode);
126 } 126 }
127 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag, 127 if (lpScriptContext->QueryNodeByFlag(pRefNode, wsPropName, hValue, dwFlag,
128 TRUE)) { 128 TRUE)) {
129 return; 129 return;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 void CXFA_ScriptContext::GlobalPropertyGetter(FXJSE_HOBJECT hObject, 168 void CXFA_ScriptContext::GlobalPropertyGetter(FXJSE_HOBJECT hObject,
169 const CFX_ByteStringC& szPropName, 169 const CFX_ByteStringC& szPropName,
170 FXJSE_HVALUE hValue) { 170 FXJSE_HVALUE hValue) {
171 CXFA_Object* pOrginalObject = 171 CXFA_Object* pOrginalObject =
172 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 172 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
173 CXFA_Document* pDoc = pOrginalObject->GetDocument(); 173 CXFA_Document* pDoc = pOrginalObject->GetDocument();
174 CXFA_ScriptContext* lpScriptContext = 174 CXFA_ScriptContext* lpScriptContext =
175 (CXFA_ScriptContext*)pDoc->GetScriptContext(); 175 (CXFA_ScriptContext*)pDoc->GetScriptContext();
176 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOrginalObject); 176 CXFA_Object* lpCurNode = lpScriptContext->GetVariablesThis(pOrginalObject);
177 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 177 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
178 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 178 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
179 if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) { 179 if (lpScriptContext->GetType() == XFA_SCRIPTLANGTYPE_Formcalc) {
180 if (szPropName == FOXIT_XFA_FM2JS_FORMCALC_RUNTIME) { 180 if (szPropName == FOXIT_XFA_FM2JS_FORMCALC_RUNTIME) {
181 XFA_FM2JS_GlobalPropertyGetter(lpScriptContext->m_hFM2JSContext, hValue); 181 XFA_FM2JS_GlobalPropertyGetter(lpScriptContext->m_hFM2JSContext, hValue);
182 return; 182 return;
183 } 183 }
184 uint32_t uHashCode = 184 uint32_t uHashCode =
185 FX_HashCode_String_GetW(wsPropName, wsPropName.GetLength()); 185 FX_HashCode_String_GetW(wsPropName, wsPropName.GetLength());
186 if (uHashCode != XFA_HASHCODE_Layout) { 186 if (uHashCode != XFA_HASHCODE_Layout) {
187 CXFA_Object* pObject = 187 CXFA_Object* pObject =
188 lpScriptContext->GetDocument()->GetXFAObject(uHashCode); 188 lpScriptContext->GetDocument()->GetXFAObject(uHashCode);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 void CXFA_ScriptContext::NormalPropertyGetter(FXJSE_HOBJECT hObject, 224 void CXFA_ScriptContext::NormalPropertyGetter(FXJSE_HOBJECT hObject,
225 const CFX_ByteStringC& szPropName, 225 const CFX_ByteStringC& szPropName,
226 FXJSE_HVALUE hValue) { 226 FXJSE_HVALUE hValue) {
227 CXFA_Object* pOrginalObject = 227 CXFA_Object* pOrginalObject =
228 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 228 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
229 if (pOrginalObject == NULL) { 229 if (pOrginalObject == NULL) {
230 FXJSE_Value_SetUndefined(hValue); 230 FXJSE_Value_SetUndefined(hValue);
231 return; 231 return;
232 } 232 }
233 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 233 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
234 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 234 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
235 CXFA_ScriptContext* lpScriptContext = 235 CXFA_ScriptContext* lpScriptContext =
236 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); 236 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
237 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); 237 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
238 if (wsPropName == FX_WSTRC(L"xfa")) { 238 if (wsPropName == FX_WSTRC(L"xfa")) {
239 FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap( 239 FXJSE_HVALUE pValue = lpScriptContext->GetJSValueFromMap(
240 lpScriptContext->GetDocument()->GetRoot()); 240 lpScriptContext->GetDocument()->GetRoot());
241 FXJSE_Value_Set(hValue, pValue); 241 FXJSE_Value_Set(hValue, pValue);
242 return; 242 return;
243 } 243 }
244 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | 244 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
(...skipping 28 matching lines...) Expand all
273 FXJSE_HVALUE hValue) { 273 FXJSE_HVALUE hValue) {
274 CXFA_Object* pOrginalObject = 274 CXFA_Object* pOrginalObject =
275 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 275 (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
276 if (pOrginalObject == NULL) { 276 if (pOrginalObject == NULL) {
277 return; 277 return;
278 } 278 }
279 CXFA_ScriptContext* lpScriptContext = 279 CXFA_ScriptContext* lpScriptContext =
280 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext(); 280 (CXFA_ScriptContext*)pOrginalObject->GetDocument()->GetScriptContext();
281 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject); 281 CXFA_Object* pObject = lpScriptContext->GetVariablesThis(pOrginalObject);
282 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 282 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
283 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 283 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
284 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo = 284 const XFA_SCRIPTATTRIBUTEINFO* lpAttributeInfo =
285 XFA_GetScriptAttributeByName(pObject->GetClassID(), wsPropName); 285 XFA_GetScriptAttributeByName(pObject->GetClassID(), wsPropName);
286 if (lpAttributeInfo) { 286 if (lpAttributeInfo) {
287 (pObject->*(lpAttributeInfo->lpfnCallback))( 287 (pObject->*(lpAttributeInfo->lpfnCallback))(
288 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute); 288 hValue, TRUE, (XFA_ATTRIBUTE)lpAttributeInfo->eAttribute);
289 } else { 289 } else {
290 if (pObject->IsNode()) { 290 if (pObject->IsNode()) {
291 if (wsPropName.GetAt(0) == '#') { 291 if (wsPropName.GetAt(0) == '#') {
292 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1); 292 wsPropName = wsPropName.Right(wsPropName.GetLength() - 1);
293 } 293 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 FX_BOOL bQueryIn) { 325 FX_BOOL bQueryIn) {
326 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 326 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
327 if (pObject == NULL) { 327 if (pObject == NULL) {
328 return FXJSE_ClassPropType_None; 328 return FXJSE_ClassPropType_None;
329 } 329 }
330 CXFA_ScriptContext* lpScriptContext = 330 CXFA_ScriptContext* lpScriptContext =
331 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); 331 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
332 pObject = lpScriptContext->GetVariablesThis(pObject); 332 pObject = lpScriptContext->GetVariablesThis(pObject);
333 XFA_ELEMENT objElement = pObject->GetClassID(); 333 XFA_ELEMENT objElement = pObject->GetClassID();
334 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 334 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
335 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 335 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
336 if (XFA_GetMethodByName(objElement, wsPropName)) { 336 if (XFA_GetMethodByName(objElement, wsPropName)) {
337 return FXJSE_ClassPropType_Method; 337 return FXJSE_ClassPropType_Method;
338 } 338 }
339 if (bQueryIn && !XFA_GetScriptAttributeByName(objElement, wsPropName)) { 339 if (bQueryIn && !XFA_GetScriptAttributeByName(objElement, wsPropName)) {
340 return FXJSE_ClassPropType_None; 340 return FXJSE_ClassPropType_None;
341 } 341 }
342 return FXJSE_ClassPropType_Property; 342 return FXJSE_ClassPropType_Property;
343 } 343 }
344 int32_t CXFA_ScriptContext::GlobalPropTypeGetter( 344 int32_t CXFA_ScriptContext::GlobalPropTypeGetter(
345 FXJSE_HOBJECT hObject, 345 FXJSE_HOBJECT hObject,
346 const CFX_ByteStringC& szPropName, 346 const CFX_ByteStringC& szPropName,
347 FX_BOOL bQueryIn) { 347 FX_BOOL bQueryIn) {
348 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL); 348 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hObject, NULL);
349 if (pObject == NULL) { 349 if (pObject == NULL) {
350 return FXJSE_ClassPropType_None; 350 return FXJSE_ClassPropType_None;
351 } 351 }
352 CXFA_ScriptContext* lpScriptContext = 352 CXFA_ScriptContext* lpScriptContext =
353 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); 353 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
354 pObject = lpScriptContext->GetVariablesThis(pObject); 354 pObject = lpScriptContext->GetVariablesThis(pObject);
355 XFA_ELEMENT objElement = pObject->GetClassID(); 355 XFA_ELEMENT objElement = pObject->GetClassID();
356 CFX_WideString wsPropName = CFX_WideString::FromUTF8( 356 CFX_WideString wsPropName = CFX_WideString::FromUTF8(
357 (const FX_CHAR*)szPropName.GetPtr(), szPropName.GetLength()); 357 (const FX_CHAR*)szPropName.raw_str(), szPropName.GetLength());
358 if (XFA_GetMethodByName(objElement, wsPropName)) { 358 if (XFA_GetMethodByName(objElement, wsPropName)) {
359 return FXJSE_ClassPropType_Method; 359 return FXJSE_ClassPropType_Method;
360 } 360 }
361 return FXJSE_ClassPropType_Property; 361 return FXJSE_ClassPropType_Property;
362 } 362 }
363 void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis, 363 void CXFA_ScriptContext::NormalMethodCall(FXJSE_HOBJECT hThis,
364 const CFX_ByteStringC& szFuncName, 364 const CFX_ByteStringC& szFuncName,
365 CFXJSE_Arguments& args) { 365 CFXJSE_Arguments& args) {
366 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL); 366 CXFA_Object* pObject = (CXFA_Object*)FXJSE_Value_ToObject(hThis, NULL);
367 if (pObject == NULL) { 367 if (pObject == NULL) {
368 return; 368 return;
369 } 369 }
370 CXFA_ScriptContext* lpScriptContext = 370 CXFA_ScriptContext* lpScriptContext =
371 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext(); 371 (CXFA_ScriptContext*)pObject->GetDocument()->GetScriptContext();
372 pObject = lpScriptContext->GetVariablesThis(pObject); 372 pObject = lpScriptContext->GetVariablesThis(pObject);
373 CFX_WideString wsFunName = CFX_WideString::FromUTF8( 373 CFX_WideString wsFunName = CFX_WideString::FromUTF8(
374 (const FX_CHAR*)szFuncName.GetPtr(), szFuncName.GetLength()); 374 (const FX_CHAR*)szFuncName.raw_str(), szFuncName.GetLength());
375 const XFA_METHODINFO* lpMethodInfo = 375 const XFA_METHODINFO* lpMethodInfo =
376 XFA_GetMethodByName(pObject->GetClassID(), wsFunName); 376 XFA_GetMethodByName(pObject->GetClassID(), wsFunName);
377 if (NULL == lpMethodInfo) { 377 if (NULL == lpMethodInfo) {
378 return; 378 return;
379 } 379 }
380 (pObject->*(lpMethodInfo->lpfnCallback))(&args); 380 (pObject->*(lpMethodInfo->lpfnCallback))(&args);
381 } 381 }
382 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() { 382 FX_BOOL CXFA_ScriptContext::IsStrictScopeInJavaScript() {
383 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping); 383 return m_pDocument->HasFlag(XFA_DOCFLAG_StrictScoping);
384 } 384 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 } 457 }
458 CXFA_Node* pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild); 458 CXFA_Node* pTextNode = pScriptNode->GetNodeItem(XFA_NODEITEM_FirstChild);
459 if (!pTextNode) { 459 if (!pTextNode) {
460 return FALSE; 460 return FALSE;
461 } 461 }
462 CFX_WideStringC wsScript; 462 CFX_WideStringC wsScript;
463 if (!pTextNode->TryCData(XFA_ATTRIBUTE_Value, wsScript)) { 463 if (!pTextNode->TryCData(XFA_ATTRIBUTE_Value, wsScript)) {
464 return FALSE; 464 return FALSE;
465 } 465 }
466 CFX_ByteString btScript = 466 CFX_ByteString btScript =
467 FX_UTF8Encode(wsScript.GetPtr(), wsScript.GetLength()); 467 FX_UTF8Encode(wsScript.raw_str(), wsScript.GetLength());
468 FXJSE_HVALUE hRetValue = FXJSE_Value_Create(m_hJsRuntime); 468 FXJSE_HVALUE hRetValue = FXJSE_Value_Create(m_hJsRuntime);
469 CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent); 469 CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent);
470 FXJSE_HCONTEXT hVariablesContext = 470 FXJSE_HCONTEXT hVariablesContext =
471 CreateVariablesContext(pScriptNode, pThisObject); 471 CreateVariablesContext(pScriptNode, pThisObject);
472 CXFA_Object* pOriginalObject = m_pThisObject; 472 CXFA_Object* pOriginalObject = m_pThisObject;
473 m_pThisObject = pThisObject; 473 m_pThisObject = pThisObject;
474 FX_BOOL bRet = FXJSE_ExecuteScript(hVariablesContext, btScript, hRetValue); 474 FX_BOOL bRet = FXJSE_ExecuteScript(hVariablesContext, btScript, hRetValue);
475 m_pThisObject = pOriginalObject; 475 m_pThisObject = pOriginalObject;
476 FXJSE_Value_Release(hRetValue); 476 FXJSE_Value_Release(hRetValue);
477 return bRet; 477 return bRet;
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 } 771 }
772 } 772 }
773 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) { 773 void CXFA_ScriptContext::AddNodesOfRunScript(CXFA_Node* pNode) {
774 if (!m_pScriptNodeArray) { 774 if (!m_pScriptNodeArray) {
775 return; 775 return;
776 } 776 }
777 if (m_pScriptNodeArray->Find(pNode) == -1) { 777 if (m_pScriptNodeArray->Find(pNode) == -1) {
778 m_pScriptNodeArray->Add(pNode); 778 m_pScriptNodeArray->Add(pNode);
779 } 779 }
780 } 780 }
OLDNEW
« no previous file with comments | « xfa/fxfa/parser/xfa_script_hostpseudomodel.cpp ('k') | xfa/fxfa/parser/xfa_script_resolveprocessor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698