Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/plugin/PluginClass.cpp

Issue 5163581322559488: Issue 1283 - wrong usage of memset, fix sizeof, make proper initializing (Closed)
Patch Set: remove intializating call Created Oct. 13, 2014, 9:47 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #include "PluginStdAfx.h" 1 #include "PluginStdAfx.h"
2 2
3 #include "PluginClass.h" 3 #include "PluginClass.h"
4 #include "PluginSettings.h" 4 #include "PluginSettings.h"
5 #include "PluginSystem.h" 5 #include "PluginSystem.h"
6 #include "PluginFilter.h" 6 #include "PluginFilter.h"
7 #include "PluginMimeFilterClient.h" 7 #include "PluginMimeFilterClient.h"
8 #include "PluginClient.h" 8 #include "PluginClient.h"
9 #include "PluginClientFactory.h" 9 #include "PluginClientFactory.h"
10 #include "PluginMutex.h" 10 #include "PluginMutex.h"
11 #include "sddl.h" 11 #include "sddl.h"
12 #include "PluginUtil.h" 12 #include "PluginUtil.h"
13 #include "PluginUserSettings.h" 13 #include "PluginUserSettings.h"
14 #include "../shared/Utils.h" 14 #include "../shared/Utils.h"
15 #include "../shared/Dictionary.h" 15 #include "../shared/Dictionary.h"
16 #include <thread> 16 #include <thread>
17 #include <array>
17 18
18 #ifdef DEBUG_HIDE_EL 19 #ifdef DEBUG_HIDE_EL
19 DWORD profileTime = 0; 20 DWORD profileTime = 0;
20 #endif 21 #endif
21 22
22 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); 23 typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR);
23 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT); 24 typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPR ECT);
24 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); 25 typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE);
25 26
26 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL }; 27 HICON CPluginClass::s_hIcons[ICON_MAX] = { NULL, NULL, NULL };
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 409
409 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite); 410 return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite);
410 } 411 }
411 412
412 bool CPluginClass::IsStatusBarEnabled() 413 bool CPluginClass::IsStatusBarEnabled()
413 { 414 {
414 DEBUG_GENERAL("IsStatusBarEnabled start"); 415 DEBUG_GENERAL("IsStatusBarEnabled start");
415 HKEY pHkey; 416 HKEY pHkey;
416 HKEY pHkeySub; 417 HKEY pHkeySub;
417 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey); 418 RegOpenCurrentUser(KEY_QUERY_VALUE, &pHkey);
418 DWORD trueth = 1; 419 DWORD truth = 1;
419 DWORD truethSize = sizeof(DWORD); 420 DWORD truthSize = sizeof(truth);
420 RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\Main", &pHkeySub); 421 RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\Main", &pHkeySub);
421 LONG res = RegQueryValueEx(pHkeySub, L"StatusBarWeb", NULL, NULL, (BYTE*)&true th, &truethSize); 422 LONG res = RegQueryValueEx(pHkeySub, L"StatusBarWeb", NULL, NULL, (BYTE*)&trut h, &truthSize);
422 RegCloseKey(pHkey); 423 RegCloseKey(pHkey);
423 if (res != ERROR_SUCCESS) 424 if (res != ERROR_SUCCESS)
424 { 425 {
425 res = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\MINIE", &p HkeySub); 426 res = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\MINIE", &p HkeySub);
426 if (res == ERROR_SUCCESS) 427 if (res == ERROR_SUCCESS)
427 { 428 {
428 LONG res = RegQueryValueEx(pHkeySub, L"ShowStatusBar", NULL, NULL, (BYTE*) &trueth, &truethSize); 429 LONG res = RegQueryValueEx(pHkeySub, L"ShowStatusBar", NULL, NULL, (BYTE*) &truth, &truthSize);
429 if (res == ERROR_SUCCESS) 430 if (res == ERROR_SUCCESS)
430 { 431 {
431 RegCloseKey(pHkey); 432 RegCloseKey(pHkey);
432 } 433 }
433 } 434 }
434 } 435 }
435 DEBUG_GENERAL("IsStatusBarEnabled end"); 436 DEBUG_GENERAL("IsStatusBarEnabled end");
436 return trueth == 1; 437 return truth == 1;
437 } 438 }
438 439
439 void CPluginClass::ShowStatusBar() 440 void CPluginClass::ShowStatusBar()
440 { 441 {
441 DEBUG_GENERAL("ShowStatusBar start"); 442 DEBUG_GENERAL("ShowStatusBar start");
442 443
443 VARIANT_BOOL isVisible; 444 VARIANT_BOOL isVisible;
444 445
445 446
446 CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser(); 447 CComQIPtr<IWebBrowser2> browser = GetAsyncBrowser();
(...skipping 24 matching lines...) Expand all
471 MB_OK); 472 MB_OK);
472 return; 473 return;
473 } 474 }
474 // Ask if a user wants to enable a status bar automatically 475 // Ask if a user wants to enable a status bar automatically
475 LRESULT res = MessageBox((HWND)m_hTabWnd, 476 LRESULT res = MessageBox((HWND)m_hTabWnd,
476 dictionary->Lookup("status-bar", "question").c_str(), 477 dictionary->Lookup("status-bar", "question").c_str(),
477 dictionary->Lookup("status-bar", "title").c_str(), 478 dictionary->Lookup("status-bar", "title").c_str(),
478 MB_YESNO); 479 MB_YESNO);
479 if (res == IDYES) 480 if (res == IDYES)
480 { 481 {
481 DWORD trueth = 1; 482 DWORD truth = 1;
482 regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M INIE", &pHkeySub); 483 regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M INIE", &pHkeySub);
483 regRes = RegSetValueEx(pHkeySub, L"ShowStatusBar", 0, REG_DWORD, (BYTE *)&trueth, sizeof(DWORD)); 484 regRes = RegSetValueEx(pHkeySub, L"ShowStatusBar", 0, REG_DWORD, (BYTE *)&truth, sizeof(truth));
484 regRes = RegCloseKey(pHkeySub); 485 regRes = RegCloseKey(pHkeySub);
485 regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M ain", &pHkeySub); 486 regRes = RegOpenKey(pHkey, L"Software\\Microsoft\\Internet Explorer\\M ain", &pHkeySub);
486 regRes = RegSetValueEx(pHkeySub, L"StatusBarWeb", 0, REG_DWORD, (BYTE* )&trueth, sizeof(DWORD)); 487 regRes = RegSetValueEx(pHkeySub, L"StatusBarWeb", 0, REG_DWORD, (BYTE* )&truth, sizeof(truth));
487 regRes = RegCloseKey(pHkeySub); 488 regRes = RegCloseKey(pHkeySub);
488 hr = browser->put_StatusBar(TRUE); 489 hr = browser->put_StatusBar(TRUE);
489 if (FAILED(hr)) 490 if (FAILED(hr))
490 { 491 {
491 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_PUT_STATUSBAR, "Class::Enable statusbar"); 492 DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_PUT_STATUSBAR, "Class::Enable statusbar");
492 } 493 }
493 CreateStatusBarPane(); 494 CreateStatusBarPane();
494 495
495 // We need to restart the tab now, to enable the status bar properly 496 // We need to restart the tab now, to enable the status bar properly
496 VARIANT vFlags; 497 VARIANT vFlags;
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 } 799 }
799 } 800 }
800 } 801 }
801 s_criticalSectionLocal.Unlock(); 802 s_criticalSectionLocal.Unlock();
802 803
803 // Register pane class 804 // Register pane class
804 if (!GetAtomPaneClass()) 805 if (!GetAtomPaneClass())
805 { 806 {
806 WNDCLASSEX wcex; 807 WNDCLASSEX wcex;
807 808
808 wcex.cbSize = sizeof(WNDCLASSEX); 809 wcex.cbSize = sizeof(wcex);
809 wcex.style = 0; 810 wcex.style = 0;
810 wcex.lpfnWndProc = (WNDPROC)PaneWindowProc; 811 wcex.lpfnWndProc = (WNDPROC)PaneWindowProc;
811 wcex.cbClsExtra = 0; 812 wcex.cbClsExtra = 0;
812 wcex.cbWndExtra = 0; 813 wcex.cbWndExtra = 0;
813 wcex.hInstance = _Module.m_hInst; 814 wcex.hInstance = _Module.m_hInst;
814 wcex.hIcon = NULL; 815 wcex.hIcon = NULL;
815 wcex.hCursor = NULL; 816 wcex.hCursor = NULL;
816 wcex.hbrBackground = NULL; 817 wcex.hbrBackground = NULL;
817 wcex.lpszMenuName = NULL; 818 wcex.lpszMenuName = NULL;
818 wcex.lpszClassName = STATUSBAR_PANE_NAME; 819 wcex.lpszClassName = STATUSBAR_PANE_NAME;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 s_criticalSectionLocal.Unlock(); 875 s_criticalSectionLocal.Unlock();
875 return true; 876 return true;
876 } 877 }
877 878
878 bool CPluginClass::CreateStatusBarPane() 879 bool CPluginClass::CreateStatusBarPane()
879 { 880 {
880 CriticalSection::Lock lock(m_csStatusBar); 881 CriticalSection::Lock lock(m_csStatusBar);
881 882
882 CPluginClient* client = CPluginClient::GetInstance(); 883 CPluginClient* client = CPluginClient::GetInstance();
883 884
884 wchar_t szClassName[MAX_PATH]; 885 std::array<wchar_t, MAX_PATH> className;
885 // Get browser window and url 886 // Get browser window and url
886 HWND hBrowserWnd = GetBrowserHWND(); 887 HWND hBrowserWnd = GetBrowserHWND();
887 if (!hBrowserWnd) 888 if (!hBrowserWnd)
888 { 889 {
889 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C lass::CreateStatusBarPane - No status bar") 890 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C lass::CreateStatusBarPane - No status bar")
890 return false; 891 return false;
891 } 892 }
892 893
893 // Looking for a TabWindowClass window in IE7 894 // Looking for a TabWindowClass window in IE7
894 // the last one should be parent for statusbar 895 // the last one should be parent for statusbar
895 HWND hWndStatusBar = NULL; 896 HWND hWndStatusBar = NULL;
896 897
897 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); 898 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD);
898 UINT amoundOfNewTabs = 0; 899 UINT amoundOfNewTabs = 0;
899 HWND uniqueNewTab = NULL; 900 HWND uniqueNewTab = NULL;
900 while (hTabWnd) 901 while (hTabWnd)
901 { 902 {
902 memset(szClassName, 0, MAX_PATH); 903 className[0] = L'\0';
903 GetClassName(hTabWnd, szClassName, MAX_PATH); 904 // GetClassNameW returns the number of characters without '\0'
905 int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz e());
Oleksandr 2014/10/17 07:09:07 In other places of the code we use std::wstring in
904 906
905 if (wcscmp(szClassName, L"TabWindowClass") == 0 || wcscmp(szClassName,L"Fram e Tab") == 0) 907 if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 || wcscmp(className.data(), L"Frame Tab") == 0))
906 { 908 {
907 // IE8 support 909 // IE8 support
908 HWND hTabWnd2 = hTabWnd; 910 HWND hTabWnd2 = hTabWnd;
909 if (wcscmp(szClassName,L"Frame Tab") == 0) 911 if (wcscmp(className.data(), L"Frame Tab") == 0)
910 { 912 {
911 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); 913 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL);
912 } 914 }
913 915
914 if (hTabWnd2) 916 if (hTabWnd2)
915 { 917 {
916 DWORD nProcessId; 918 DWORD nProcessId;
917 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); 919 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId);
918 if (::GetCurrentProcessId() == nProcessId) 920 if (::GetCurrentProcessId() == nProcessId)
919 { 921 {
(...skipping 26 matching lines...) Expand all
946 } 948 }
947 } 949 }
948 } 950 }
949 951
950 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); 952 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT);
951 } 953 }
952 954
953 HWND hWnd = ::GetWindow(hBrowserWnd, GW_CHILD); 955 HWND hWnd = ::GetWindow(hBrowserWnd, GW_CHILD);
954 while (hWnd) 956 while (hWnd)
955 { 957 {
956 memset(szClassName, 0, MAX_PATH); 958 className[0] = L'\0';
957 ::GetClassName(hWnd, szClassName, MAX_PATH); 959 int classNameLength = GetClassNameW(hWnd, className.data(), className.size() );
958 960
959 if (wcscmp(szClassName,L"msctls_statusbar32") == 0) 961 if (classNameLength && wcscmp(className.data(), L"msctls_statusbar32") == 0)
960 { 962 {
961 hWndStatusBar = hWnd; 963 hWndStatusBar = hWnd;
962 break; 964 break;
963 } 965 }
964 966
965 hWnd = ::GetWindow(hWnd, GW_HWNDNEXT); 967 hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
966 } 968 }
967 969
968 if (!hWndStatusBar) 970 if (!hWndStatusBar)
969 { 971 {
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1274 std::wstring ctext; 1276 std::wstring ctext;
1275 1277
1276 s_criticalSectionLocal.Lock(); 1278 s_criticalSectionLocal.Lock();
1277 { 1279 {
1278 s_menuDomains.clear(); 1280 s_menuDomains.clear();
1279 } 1281 }
1280 s_criticalSectionLocal.Unlock(); 1282 s_criticalSectionLocal.Unlock();
1281 1283
1282 Dictionary* dictionary = Dictionary::GetInstance(); 1284 Dictionary* dictionary = Dictionary::GetInstance();
1283 1285
1284 MENUITEMINFOW fmii; 1286 MENUITEMINFOW fmii = {};
1285 memset(&fmii, 0, sizeof(MENUITEMINFO)); 1287 fmii.cbSize = sizeof(fmii);
1286 fmii.cbSize = sizeof(MENUITEMINFO);
1287 1288
1288 MENUITEMINFOW miiSep; 1289 MENUITEMINFOW miiSep = {};
1289 memset(&miiSep, 0, sizeof(MENUITEMINFO)); 1290 miiSep.cbSize = sizeof(miiSep);
1290 miiSep.cbSize = sizeof(MENUITEMINFO);
1291 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE; 1291 miiSep.fMask = MIIM_TYPE | MIIM_FTYPE;
1292 miiSep.fType = MFT_SEPARATOR; 1292 miiSep.fType = MFT_SEPARATOR;
1293 1293
1294 CPluginClient* client = CPluginClient::GetInstance(); 1294 CPluginClient* client = CPluginClient::GetInstance();
1295 CPluginSettings* settings = CPluginSettings::GetInstance(); 1295 CPluginSettings* settings = CPluginSettings::GetInstance();
1296 { 1296 {
1297 ctext = dictionary->Lookup("menu", "menu-disable-on-site"); 1297 ctext = dictionary->Lookup("menu", "menu-disable-on-site");
1298 // Is domain in white list? 1298 // Is domain in white list?
1299 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(to_wstring(url))); 1299 ReplaceString(ctext, L"?1?", client->GetHostFromUrl(to_wstring(url)));
1300 if (client->IsWhitelistedUrl(to_wstring(GetTab()->GetDocumentUrl()))) 1300 if (client->IsWhitelistedUrl(to_wstring(GetTab()->GetDocumentUrl())))
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1375 DWORD nProcessId; 1375 DWORD nProcessId;
1376 ::GetWindowThreadProcessId(hWndToolBar, &nProcessId); 1376 ::GetWindowThreadProcessId(hWndToolBar, &nProcessId);
1377 1377
1378 if (hWndToolBar && ::GetCurrentProcessId() == nProcessId) 1378 if (hWndToolBar && ::GetCurrentProcessId() == nProcessId)
1379 { 1379 {
1380 ::ScreenToClient(hWndToolBar, &pt); 1380 ::ScreenToClient(hWndToolBar, &pt);
1381 int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt); 1381 int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt);
1382 1382
1383 if (nButton > 0) 1383 if (nButton > 0)
1384 { 1384 {
1385 TBBUTTON pTBBtn; 1385 TBBUTTON pTBBtn = {};
1386 memset(&pTBBtn, 0, sizeof(TBBUTTON));
1387 1386
1388 if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn)) 1387 if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn))
1389 { 1388 {
1390 RECT rcButton; 1389 RECT rcButton;
1391 nIDCommand = pTBBtn.idCommand; 1390 nIDCommand = pTBBtn.idCommand;
1392 1391
1393 if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton)) 1392 if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton))
1394 { 1393 {
1395 pt.x = rcButton.left; 1394 pt.x = rcButton.left;
1396 pt.y = rcButton.bottom; 1395 pt.y = rcButton.bottom;
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1798 return icon; 1797 return icon;
1799 } 1798 }
1800 1799
1801 ATOM CPluginClass::GetAtomPaneClass() 1800 ATOM CPluginClass::GetAtomPaneClass()
1802 { 1801 {
1803 return s_atomPaneClass; 1802 return s_atomPaneClass;
1804 } 1803 }
1805 1804
1806 HWND CPluginClass::GetTabHWND() const 1805 HWND CPluginClass::GetTabHWND() const
1807 { 1806 {
1808 wchar_t szClassName[MAX_PATH]; 1807 std::array<wchar_t, MAX_PATH> className;
1809 // Get browser window and url 1808 // Get browser window and url
1810 HWND hBrowserWnd = GetBrowserHWND(); 1809 HWND hBrowserWnd = GetBrowserHWND();
1811 if (!hBrowserWnd) 1810 if (!hBrowserWnd)
1812 { 1811 {
1813 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C lass::GetTabWindow - No tab window") 1812 DEBUG_ERROR_LOG(0, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_NO_STATUSBAR_BROWSER, "C lass::GetTabWindow - No tab window")
1814 s_criticalSectionWindow.Unlock(); 1813 s_criticalSectionWindow.Unlock();
1815 1814
1816 return false; 1815 return false;
1817 } 1816 }
1818 1817
1819 // Looking for a TabWindowClass window in IE7 1818 // Looking for a TabWindowClass window in IE7
1820 1819
1821 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD); 1820 HWND hTabWnd = ::GetWindow(hBrowserWnd, GW_CHILD);
1822 while (hTabWnd) 1821 while (hTabWnd)
1823 { 1822 {
1824 memset(szClassName, 0, MAX_PATH); 1823 className[0] = L'\0';
1825 GetClassName(hTabWnd, szClassName, MAX_PATH); 1824 int classNameLength = GetClassNameW(hTabWnd, className.data(), className.siz e());
1826 1825
1827 if (wcscmp(szClassName, L"TabWindowClass") == 0 || wcscmp(szClassName, L"Fra me Tab") == 0) 1826 if (classNameLength && (wcscmp(className.data(), L"TabWindowClass") == 0 || wcscmp(className.data(), L"Frame Tab") == 0))
1828 { 1827 {
1829 // IE8 support 1828 // IE8 support
1830 HWND hTabWnd2 = hTabWnd; 1829 HWND hTabWnd2 = hTabWnd;
1831 if (wcscmp(szClassName, L"Frame Tab") == 0) 1830 if (wcscmp(className.data(), L"Frame Tab") == 0)
1832 { 1831 {
1833 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL); 1832 hTabWnd2 = ::FindWindowEx(hTabWnd2, NULL, L"TabWindowClass", NULL);
1834 } 1833 }
1835 1834
1836 if (hTabWnd2) 1835 if (hTabWnd2)
1837 { 1836 {
1838 DWORD nProcessId; 1837 DWORD nProcessId;
1839 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId); 1838 ::GetWindowThreadProcessId(hTabWnd2, &nProcessId);
1840 if (::GetCurrentProcessId() == nProcessId) 1839 if (::GetCurrentProcessId() == nProcessId)
1841 { 1840 {
(...skipping 23 matching lines...) Expand all
1865 } 1864 }
1866 } 1865 }
1867 } 1866 }
1868 1867
1869 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT); 1868 hTabWnd = ::GetWindow(hTabWnd, GW_HWNDNEXT);
1870 } 1869 }
1871 1870
1872 return hTabWnd; 1871 return hTabWnd;
1873 1872
1874 } 1873 }
OLDNEW

Powered by Google App Engine
This is Rietveld