15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Key and value names of the location of the RLZ shared state. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/lib_values.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/assert.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace rlz_lib { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ping information. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rep=2: includes the new stateful events. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProtocolCgiArgument[] = "rep=2"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEventsCgiVariable[] = "events"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStatefulEventsCgiVariable[] = "stateful-events"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEventsCgiSeparator = ','; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRlzCgiVariable[] = "rlz"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRlzCgiSeparator[] = ","; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRlzCgiIndicator[] = ":"; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductSignatureCgiVariable[] = "as"; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductBrandCgiVariable[] = "brand"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductLanguageCgiVariable[] = "hl"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProductIdCgiVariable[] = "pid"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDccCgiVariable[] = "dcc"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kRlsCgiVariable[] = "rls"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMachineIdCgiVariable[] = "id"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSetDccResponseVariable[] = "set_dcc"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Financial server information. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFinancialPingPath[] = "/tools/pso/ping"; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFinancialServer[] = "clients1.google.com"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFinancialPort = 80; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ping times in 100-nanosecond intervals. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kEventsPingInterval = 24LL * 3600LL * 10000000LL; // 1 day 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kNoEventsPingInterval = kEventsPingInterval * 7LL; // 1 week 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFinancialPingUserAgent[] = "Mozilla/4.0 (compatible; Win32)"; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kFinancialPingResponseObjects[] = { "text/*", NULL }; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AccessPoint and Event names. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetAccessPointName(AccessPoint point) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (point) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NO_ACCESS_POINT: return ""; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IE_DEFAULT_SEARCH: return "I7"; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IE_HOME_PAGE: return "W1"; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IETB_SEARCH_BOX: return "T4"; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case QUICK_SEARCH_BOX: return "Q1"; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GD_DESKBAND: return "D1"; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GD_SEARCH_GADGET: return "D2"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GD_WEB_SERVER: return "D3"; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GD_OUTLOOK: return "D4"; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME_OMNIBOX: return "C1"; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME_HOME_PAGE: return "C2"; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FFTB2_BOX: return "B2"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FFTB3_BOX: return "B3"; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PINYIN_IME_BHO: return "N1"; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IGOOGLE_WEBPAGE: return "G1"; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MOBILE_IDLE_SCREEN_BLACKBERRY: return "H1"; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MOBILE_IDLE_SCREEN_WINMOB: return "H2"; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MOBILE_IDLE_SCREEN_SYMBIAN: return "H3"; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FF_HOME_PAGE: return "R0"; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FF_SEARCH_BOX: return "R1"; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IE_BROWSED_PAGE: return "R2"; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case QSB_WIN_BOX: return "R3"; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBAPPS_CALENDAR: return "R4"; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBAPPS_DOCS: return "R5"; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBAPPS_GMAIL: return "R6"; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IETB_LINKDOCTOR: return "R7"; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FFTB_LINKDOCTOR: return "R8"; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IETB7_SEARCH_BOX: return "T7"; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TB8_SEARCH_BOX: return "T8"; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME_FRAME: return "C3"; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER_AP_1: return "V1"; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER_AP_2: return "V2"; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER_AP_3: return "V3"; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER_AP_4: return "V4"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER_AP_5: return "V5"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME_MAC_OMNIBOX: return "C5"; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME_MAC_HOME_PAGE: return "C6"; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROMEOS_OMNIBOX: return "CA"; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROMEOS_HOME_PAGE: return "CB"; 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case CHROMEOS_APP_LIST: return "CC"; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case CHROME_IOS_OMNIBOX_TABLET: return "C9"; 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case CHROME_IOS_OMNIBOX_MOBILE: return "CD"; 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case CHROME_APP_LIST: return "C7"; 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case CHROME_MAC_APP_LIST: return "C8"; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_Q: return "RQ"; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_R: return "RR"; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_S: return "RS"; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_T: return "RT"; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_U: return "RU"; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_V: return "RV"; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_W: return "RW"; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_X: return "RX"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_Y: return "RY"; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNDEFINED_AP_Z: return "RZ"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP0: return "U0"; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP1: return "U1"; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP2: return "U2"; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP3: return "U3"; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP4: return "U4"; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP5: return "U5"; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP6: return "U6"; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP7: return "U7"; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP8: return "U8"; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP9: return "U9"; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP10: return "UA"; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP11: return "UB"; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP12: return "UC"; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK_AP13: return "UD"; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LAST_ACCESS_POINT: ; // Fall through. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STRING("GetAccessPointName: Unknown Access Point"); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetAccessPointFromName(const char* name, AccessPoint* point) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!point) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STRING("GetAccessPointFromName: point is NULL"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *point = NO_ACCESS_POINT; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = NO_ACCESS_POINT; i < LAST_ACCESS_POINT; i++) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, GetAccessPointName(static_cast<AccessPoint>(i))) == 0) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *point = static_cast<AccessPoint>(i); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetEventName(Event event) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case INVALID_EVENT: return ""; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case INSTALL: return "I"; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SET_TO_GOOGLE: return "S"; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FIRST_SEARCH: return "F"; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case REPORT_RLS: return "R"; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ACTIVATE: return "A"; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case LAST_EVENT: ; // Fall through. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STRING("GetPointName: Unknown Event"); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetEventFromName(const char* name, Event* event) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STRING("GetEventFromName: event is NULL"); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *event = INVALID_EVENT; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = INVALID_EVENT; i < LAST_EVENT; i++) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(name, GetEventName(static_cast<Event>(i))) == 0) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *event = static_cast<Event>(i); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetProductName(Product product) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (product) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IE_TOOLBAR: return "T"; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TOOLBAR_NOTIFIER: return "P"; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PACK: return "U"; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DESKTOP: return "D"; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CHROME: return "C"; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case FF_TOOLBAR: return "B"; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case QSB_WIN: return "K"; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WEBAPPS: return "W"; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PINYIN_IME: return "N"; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PARTNER: return "V"; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_STRING("GetProductName: Unknown Product"); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ""; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace rlz_lib 209