'//+---------------------------------------------------------------------------- '// '// File: global.bas '// '// Module: pbadmin.exe '// '// Synopsis: The implementation of functions global to PBA. '// '// Copyright (c) 1997-1999 Microsoft Corporation '// '// Author: quintinb Created Header 09/02/99 '// '//+---------------------------------------------------------------------------- Attribute VB_Name = "global" Option Explicit 'Declare configuration global variables Public PBFileName As String Public RegionFilename As String Public signature As String Public PartialCab As String Public FullCab As String Public DBName As String Public locPath As Variant 'define the app path. Public updateFound As Integer Public gStatusText(0 To 1) As String Public gRegionText(-1 To 0) As String Public gCommandStatus As Integer Public gBuildDir Public gCLError As Boolean Public HTMLHelpFile As String ' Registry and resource values Global gsRegAppTitle As String 'region edit list Type EditLists Action() As String Region() As String OldRegion() As String ID() As Integer Count As Integer End Type Public Type tmpFont Name As String Size As Integer Charset As Integer End Type Public gfnt As tmpFont 'Declare the global constants for flag calculations Global Const Global_Or = 2 Global Const Global_And = &HFFFF Public result As Long Public service As Integer 'Set the check point for the insert operation Public code As Integer Public Type bitValues desc(1) As String End Type Public gQuote As String 'Declare the database and dynasets for the tables Public gsCurrentPB As String Public gsCurrentPBPath As String Public MyWorkspace As Workspace Public gsyspb As Database Public Gsyspbpost As Database Public GsysRgn As Recordset Public GsysCty As Recordset Public GsysDial As Recordset Public GsysVer As Recordset Public GsysDelta As Recordset 'Declare the recordset for accessing information Public GsysNRgn As Recordset Public GsysNCty As Recordset Public GsysNDial As Recordset Public GsysNVer As Recordset Public GsysNDelta As Recordset Public temp As Recordset 'Declare recordset to directly hand DAO RS to data control Public rsDataDelta As Recordset Public dbDataDelta As Database 'registry Global Const HKEY_LOCAL_MACHINE = &H80000002 Global Const KEY_ALL_ACCESS = &H3F Global Const ERROR_NONE = 0 Public Const REG_SZ = 1 Public Const REG_DWORD = 4 Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value. Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _ "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _ String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _ As String, lpcbData As Long) As Long Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _ "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _ String, ByVal lpReserved As Long, lpType As Long, lpData As _ Long, lpcbData As Long) As Long Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _ "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _ String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _ As Long, lpcbData As Long) As Long 'Public gsDAOPath As String 'Declare Function DllRegisterServer Lib "gsDAOPath" () As Long Declare Function OSWritePrivateProfileString% Lib "kernel32" _ Alias "WritePrivateProfileStringA" _ (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal FileName$) Declare Function OSWritePrivateProfileSection% Lib "kernel32" _ Alias "WritePrivateProfileSectionA" _ (ByVal AppName$, ByVal KeyName$, ByVal FileName$) 'Declare Function OSGetPrivateProfileString% Lib "kernel32" _ ' Alias "GetPrivateProfileStringA" _ ' (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal ReturnString$, ByVal NumBytes As Integer, ByVal FileName$) Declare Function OSWinHelp% Lib "user32" Alias "WinHelpA" (ByVal hWnd&, ByVal HelpFile$, ByVal wCommand%, dwData As Any) 'helpfile API 'Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, ByVal HelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long 'helpfile API Declare Function HtmlHelp Lib "hhwrap.dll" Alias "CallHtmlHelp" (ByVal hWnd As Long, ByVal HelpFile As String, ByVal wCommand As Long, ByVal dwData As Any) As Long 'Declare Function HtmlHelp Lib "hhctrl.ocx" Alias "HtmlHelpA" (ByVal hWnd As Long, ByVal HelpFile As String, ByVal wCommand As Long, dwData As Any) As Long Public Const HELP_CONTEXT = &H1 Public Const HELP_INDEX = &H3 Public Const HH_DISPLAY_TOPIC = &H0 Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long Declare Function GetUserDefaultLCID& Lib "kernel32" () Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, _ lpReOpenBuff As OFSTRUCT, _ ByVal wStyle As Long) As Long Public Const OFS_MAXPATHNAME = 128 Public Const OF_EXIST = &H4000 Declare Function apiGetWindowsDirectory& Lib "kernel32" Alias _ "GetWindowsDirectoryA" (ByVal lpbuffer As String, ByVal _ nSize As Long) Type OFSTRUCT cBytes As Byte fFixedDisk As Byte nErrCode As Integer Reserved1 As Integer Reserved2 As Integer szPathName(OFS_MAXPATHNAME) As Byte End Type Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long Public Const RESOURCETYPE_DISK = &H1 Type NETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment As String lpProvider As String End Type Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias _ "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, _ lpSectorsPerCluster As Long, lpBytesPerSector As Long, _ lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) _ As Long Public Const VER_PLATFORM_WIN32s = 0 Public Const VER_PLATFORM_WIN32_WINDOWS = 1 Public Const VER_PLATFORM_WIN32_NT = 2 Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Maintenance string for PSS usage End Type Public Sub GetFont(fnt As tmpFont) Const DEFAULT_CHARSET = 1 Const SYMBOL_CHARSET = 2 Const SHIFTJIS_CHARSET = 128 Const HANGEUL_CHARSET = 129 Const CHINESEBIG5_CHARSET = 136 Const CHINESESIMPLIFIED_CHARSET = 134 Dim MyLCID As Integer MyLCID = GetUserDefaultLCID() Select Case MyLCID Case &H404 ' Traditional Chinese fnt.Charset = CHINESEBIG5_CHARSET fnt.Name = ChrW(&H65B0) + ChrW(&H7D30) + ChrW(&H660E) _ + ChrW(&H9AD4) 'New Ming-Li fnt.Size = 9 Case &H411 ' Japan fnt.Charset = SHIFTJIS_CHARSET fnt.Name = ChrW(&HFF2D) + ChrW(&HFF33) + ChrW(&H20) + ChrW(&HFF30) + _ ChrW(&H30B4) + ChrW(&H30B7) + ChrW(&H30C3) + ChrW(&H30AF) fnt.Size = 9 Case &H412 'Korea UserLCID fnt.Charset = HANGEUL_CHARSET fnt.Name = ChrW(&HAD74) + ChrW(&HB9BC) 'Korea FontName fnt.Size = 9 'Korea FontSize Case &H804 ' Simplified Chinese fnt.Charset = CHINESESIMPLIFIED_CHARSET fnt.Name = ChrW(&H5B8B) + ChrW(&H4F53) fnt.Size = 9 Case Else ' The other countries fnt.Charset = DEFAULT_CHARSET fnt.Name = "MS Sans Serif" fnt.Size = 8 End Select End Sub Function DeletePOP(ByRef ID As Long, ByRef dbPB As Database) As Integer Dim strSQL As String Dim deltnum As Integer, i As Integer Dim deltasql As String Dim deletecheck As Recordset Set GsysDial = dbPB.OpenRecordset("select * from Dialupport where accessnumberId = " & CStr(ID), dbOpenSnapshot) If GsysDial.EOF And GsysDial.BOF Then DeletePOP = ID Exit Function End If strSQL = "DELETE FROM DialUpPort WHERE AccessNumberID = " & ID dbPB.Execute strSQL Set GsysDelta = dbPB.OpenRecordset("Select * from Delta order by DeltaNum", dbOpenDynaset) If GsysDelta.RecordCount = 0 Then deltnum = 1 Else GsysDelta.MoveLast deltnum = GsysDelta!deltanum If deltnum > 6 Then deltnum = deltnum - 1 End If End If For i = 1 To deltnum deltasql = "Select * from delta where DeltaNum = " & i% & _ " AND AccessNumberId = '" & ID & "' " & _ " order by DeltaNum" Set GsysDelta = dbPB.OpenRecordset(deltasql, dbOpenDynaset) If Not (GsysDelta.BOF And GsysDelta.EOF) Then GsysDelta.Edit Else GsysDelta.AddNew GsysDelta!deltanum = i% GsysDelta!AccessNumberId = ID End If GsysDelta!CountryNumber = 0 GsysDelta!AreaCode = 0 GsysDelta!AccessNumber = 0 GsysDelta!MinimumSpeed = 0 GsysDelta!MaximumSpeed = 0 GsysDelta!RegionID = 0 GsysDelta!CityName = "0" GsysDelta!ScriptId = "0" GsysDelta!Flags = 0 GsysDelta.Update Next i% Set deletecheck = dbPB.OpenRecordset("DialUpPort", dbOpenSnapshot) If deletecheck.RecordCount = 0 Then dbPB.Execute "DELETE from PhoneBookVersions" dbPB.Execute "DELETE from delta" End If LogPOPDelete GsysDial On Error GoTo 0 Exit Function DeleteErr: DeletePOP = ID Exit Function End Function Function FilterPBKey(KeyAscii As Integer, objTextBox As TextBox) As Integer Select Case KeyAscii ' space32 "34 %37 '39 *42 /47 :58 <60 =61 >62 ?63 \92 |124 !33 ,44 ;59 .46 &38 {123 }125 [91 ]93 Case 32, 34, 37, 39, 42, 47, 58, 60, 61, 62, 63, 92, 124, 33, 44, 59, 46, 38, 123, 125, 91, 93 KeyAscii = 0 Beep End Select If KeyAscii <> 8 Then Dim TextLeng As Integer ' Current text length Dim SelLeng As Integer ' Current selected text length Dim KeyLeng As Integer ' inputted character length ANSI -> 2 ' DBCS -> 4 TextLeng = LenB(StrConv(objTextBox.Text, vbFromUnicode)) SelLeng = LenB(StrConv(objTextBox.SelText, vbFromUnicode)) KeyLeng = Len(Hex(KeyAscii)) / 2 If (TextLeng - SelLeng + KeyLeng) > 8 Then KeyAscii = 0 Beep End If End If FilterPBKey = KeyAscii End Function Function FilterNumberKey(KeyAscii As Integer) As Integer ' numbers and backspace If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 8 Then KeyAscii = 0 Beep End If FilterNumberKey = KeyAscii End Function Function GetDeltaCount(ByVal version As Integer) As Integer If version > 5 Then GetDeltaCount = 5 Else GetDeltaCount = version - 1 End If End Function Function GetPBVersion(ByRef dbPB As Database) As Integer Dim rsVer As Recordset ' open db Set rsVer = dbPB.OpenRecordset("SELECT max(Version) as MaxVer FROM PhoneBookVersions") If IsNull(rsVer!MaxVer) Then GetPBVersion = 1 Else GetPBVersion = rsVer!MaxVer End If rsVer.Close End Function Function GetSQLDeltaInsert(ByRef Record As Variant, ByVal deltanum As Integer) As String Dim strSQL As String Dim intX As Integer On Error GoTo SQLInsertErr strSQL = "INSERT into Delta " & _ " (DeltaNum, AccessNumberID, CountryNumber,RegionID,CityName,AreaCode, " & _ " AccessNumber, MinimumSpeed, MaximumSpeed, FlipFactor, Flags, ScriptID)" & _ " VALUES (" & deltanum & "," For intX = 0 To 10 Select Case intX Case 1, 2, 6 To 9 strSQL = strSQL & Record(intX) & "," Case 10 strSQL = strSQL & Chr(34) & Record(intX) & Chr(34) & ")" Case Else strSQL = strSQL & Chr(34) & Record(intX) & Chr(34) & "," End Select Next GetSQLDeltaInsert = strSQL On Error GoTo 0 Exit Function SQLInsertErr: Exit Function End Function Function GetSQLDeltaUpdate(ByRef Record As Variant, ByVal deltanum As Integer) As String Dim strSQL As String On Error GoTo SQLUpdateErr strSQL = "UPDATE Delta SET" & _ " CountryNumber=" & Record(1) & _ ", RegionID=" & Record(2) & _ ", CityName=" & Chr(34) & Record(3) & Chr(34) & _ ", AreaCode='" & Record(4) & "'" & _ ", AccessNumber='" & Record(5) & "'" & _ ", MinimumSpeed=" & Record(6) & _ ", MaximumSpeed=" & Record(7) & _ ", FlipFactor=" & Record(8) & _ ", Flags=" & Record(9) & _ ", ScriptID='" & Record(10) & "'" strSQL = strSQL & " WHERE AccessNumberID='" & Record(0) & "'" & _ " AND DeltaNum=" & deltanum GetSQLDeltaUpdate = strSQL On Error GoTo 0 Exit Function SQLUpdateErr: GetSQLDeltaUpdate = "" Exit Function ' If cmbstatus.ItemData(cmbstatus.ListIndex) = 1 Then ' 'insert the delta table (production pop) ' ' For i = 1 To deltnum ' deltasql = "Select * from delta where DeltaNum = " & i% & " order by DeltaNum" ' Set GsysDelta = GsysPb.OpenRecordset(deltasql, dbOpenDynaset) ' ' addFound = 0 'initialize delta not found ' Do While GsysDelta.EOF = False ' If GsysDelta!AccessNumberId = Val(txtid.Text) Then ' addFound = 1 ' Exit Do ' Else ' GsysDelta.MoveNext ' End If ' Loop ' ' If addFound = 0 Then ' GsysDelta.AddNew ' GsysDelta!deltanum = i% ' GsysDelta!AccessNumberId = txtid.Text ' Else ' GsysDelta.Edit ' End If '' GsysDelta!CountryNumber = dbCmbCty.ItemData(dbCmbCty.ListIndex) ' GsysDelta!AreaCode = maskArea.Text ' GsysDelta!AccessNumber = maskAccNo.Text ' If Trim(cmbmin.Text) <> "" Or Val(cmbmin.Text) = 0 Then ' GsysDelta!MinimumSpeed = Val(cmbmin.Text) ' Else '' GsysDelta!MinimumSpeed = Null ' End If ' If Trim(cmbmax.Text) <> "" Or Val(cmbmax.Text) = 0 Then '' GsysDelta!MaximumSpeed = Val(cmbmax.Text) ' Else ' GsysDelta!MaximumSpeed = Null ' End If '' GsysDelta!regionID = cmbRegion.ItemData(cmbRegion.ListIndex) ' GsysDelta!CityName = txtcity.Text ' GsysDelta!ScriptID = txtscript.Text ' GsysDelta!FlipFactor = 0 ' GsysDelta!Flags = result ' GsysDelta.Update ' Next i% ' End If End Function Function GetSQLPOPInsert(ByRef Record As Variant) As String Dim strSQL As String Dim intX As Integer Dim bAddFields As Boolean If UBound(Record) < 14 Then bAddFields = True Else bAddFields = False End If strSQL = "INSERT into DialUpPort " & _ " (AccessNumberID, CountryNumber,RegionID,CityName,AreaCode, " & _ " AccessNumber, MinimumSpeed, MaximumSpeed, FlipFactor, Flags, " & _ " ScriptID, Status, StatusDate, ServiceType, Comments)" & _ " VALUES (" For intX = 0 To 14 Select Case intX Case 0 To 2, 6 To 9 strSQL = strSQL & Record(intX) & "," Case 11 If bAddFields Then strSQL = strSQL & "'1'," Else 'strSQL = strSQL & "'" & Record(intX) & "'," strSQL = strSQL & Chr(34) & Record(intX) & Chr(34) & "," End If Case 12 strSQL = strSQL & "'" & Date & "'," Case 13 strSQL = strSQL & "' '," Case 14 If bAddFields Then strSQL = strSQL & "'')" Else strSQL = strSQL & "'" & Record(12) & "')" End If Case Else strSQL = strSQL & Chr(34) & Record(intX) & Chr(34) & "," End Select Next GetSQLPOPInsert = strSQL End Function Function GetSQLPOPUpdate(ByRef Record As Variant) As String Dim strSQL As String Dim bAddFields As Boolean On Error GoTo SQLUpdateErr If UBound(Record) < 14 Then bAddFields = True Else bAddFields = False End If strSQL = "UPDATE DISTINCTROW DialUpPort SET" & _ " CountryNumber=" & Record(1) & _ ", RegionID=" & Record(2) & _ ", CityName=" & Chr(34) & Record(3) & Chr(34) & _ ", AreaCode='" & Record(4) & "'" & _ ", AccessNumber='" & Record(5) & "'" & _ ", MinimumSpeed=" & Record(6) & _ ", MaximumSpeed=" & Record(7) & _ ", FlipFactor=" & Record(8) & _ ", Flags=" & Record(9) & _ ", ScriptID='" & Record(10) & "'" If bAddFields Then strSQL = strSQL & _ ", Status='1'" & _ ", StatusDate='" & Date & " '" & _ ", ServiceType=' '" & _ ", Comments=''" Else strSQL = strSQL & _ ", Status='" & Record(11) & "'" & _ ", StatusDate='" & Date & " '" & _ ", ServiceType=' '" & _ ", Comments=" & Chr(34) & Record(12) & Chr(34) End If strSQL = strSQL & " WHERE AccessNumberID=" & Record(0) GetSQLPOPUpdate = strSQL On Error GoTo 0 Exit Function SQLUpdateErr: GetSQLPOPUpdate = "" Exit Function End Function Function ReplaceChars(ByVal InString As String, ByVal OldChar As String, ByVal NewChar As String) As String Dim intX As Integer intX = 1 Do While intX < Len(InString) And intX <> 0 intX = InStr(intX, InString, OldChar) If intX < Len(InString) And intX <> 0 Then InString = Left$(InString, intX - 1) & NewChar & _ Right$(InString, Len(InString) - intX) End If Loop ReplaceChars = InString End Function Function GetDriveSpace(ByVal Drive As String, ByVal Required As Double) As Double 'input: , 'returns: , if adequate space OR ' <-2> if not adequate space OR ' <-1> if there was a problem determining space available Dim bRC As Boolean Dim intRC As Long Dim intSectors As Long Dim intBytes As Long Dim intFreeClusters As Long Dim intClusters As Long Dim strUNC As String Dim netRes As NETRESOURCE On Error GoTo GetSpaceErr Drive = Trim(Drive) If Left(Drive, 2) = "\\" Then 'unc strUNC = Right(Drive, Len(Drive) - 2) strUNC = "\\" & Left(strUNC, InStr(InStr(strUNC, "\") + 1, strUNC, "\") - 1) If ItIsNT Then ' can use GetDiskFreeSpace directly strUNC = strUNC & "\" bRC = GetDiskFreeSpace(strUNC, intSectors, intBytes, intFreeClusters, intClusters) Else netRes.dwType = RESOURCETYPE_DISK netRes.lpLocalName = "Q:" netRes.lpRemoteName = strUNC netRes.lpProvider = "" If WNetAddConnection2(netRes, vbNullString, vbNullString, 0) = 0 Then bRC = GetDiskFreeSpace(netRes.lpLocalName & "\", intSectors, intBytes, intFreeClusters, intClusters) intRC = WNetCancelConnection2(netRes.lpLocalName, 0, True) End If End If Else bRC = GetDiskFreeSpace(Left(Drive, 3), intSectors, intBytes, intFreeClusters, intClusters) End If If bRC Then GetDriveSpace = intBytes * intSectors * intFreeClusters If Required > GetDriveSpace And Not GetDriveSpace < 0 Then MsgBox LoadResString(6052) & Drive, vbExclamation GetDriveSpace = -2 End If Else GetDriveSpace = -1 'problem determining drive space End If On Error GoTo 0 Exit Function GetSpaceErr: GetDriveSpace = -1 Exit Function End Function ' comm Function GetFileStat() As Integer ' this caused a crash! ' need something better. If CheckPath(locPath & gsCurrentPB & ".mdb") <> 0 Then 'problem GetFileStat = 1 Else GetFileStat = 0 End If End Function Function GetMyShortPath(ByVal LongPath As String) As String Dim strBuffer As String Dim intRC As Integer On Error GoTo PathErr strBuffer = Space(500) intRC = GetShortPathName(LongPath, strBuffer, 500) If Trim(strBuffer) <> "" Then GetMyShortPath = Left$(strBuffer, InStr(strBuffer, Chr$(0)) - 1) Else GetMyShortPath = "" End If On Error GoTo 0 Exit Function PathErr: GetMyShortPath = "" Exit Function End Function Function ItIsNT() As Boolean Dim v As OSVERSIONINFO v.dwOSVersionInfoSize = Len(v) GetVersionEx v ItIsNT = False If v.dwPlatformId = VER_PLATFORM_WIN32_NT Then ItIsNT = True End Function Function LogEdit(ByVal Record As String) As Integer Dim intFile As Integer Dim strFile As String On Error GoTo LogErr intFile = FreeFile strFile = locPath & gsCurrentPB & "\" & gsCurrentPB & ".log" If CheckPath(strFile) <> 0 Then Open strFile For Output As #intFile Print #intFile, LoadResString(5236); ", "; LoadResString(5237) & _ ", "; LoadResString(5238); ", "; LoadResString(5239) Close intFile End If Open strFile For Append As #intFile Print #intFile, Now & ", " & Record Close #intFile On Error GoTo 0 Exit Function LogErr: Exit Function End Function Function LogError(ByVal Record As String) As Integer Dim intFile As Integer Dim strFile As String On Error GoTo LogErr intFile = FreeFile strFile = locPath & "error.log" If CheckPath(strFile) <> 0 Then Open strFile For Output As #intFile Print #intFile, LoadResString(5236); ", "; LoadResString(5237) & _ ", "; LoadResString(5238); ", "; LoadResString(5239) Close intFile End If Open strFile For Append As #intFile Print #intFile, Now & ", " & Record Close #intFile On Error GoTo 0 Exit Function LogErr: Exit Function End Function Function LogPOPAdd(ByRef RS As Recordset) As Integer Dim strAction As String Dim strRecord, strKey As String Dim intX As Integer strAction = LoadResString(5233) strRecord = LogPOPRecord(RS) strKey = RS!CityName LogEdit strAction & ", " & strKey & ", " & strRecord End Function Function LogPOPEdit(ByRef Key As String, ByRef RS As Recordset) As Integer Dim strAction As String Dim strRecord Dim intX As Integer strAction = LoadResString(5234) strRecord = LogPOPRecord(RS) LogEdit strAction & ", " & Key & ", " & strRecord End Function Function LogPOPDelete(ByRef RS As Recordset) As Integer Dim strAction As String Dim strRecord, strKey As String Dim intX As Integer strAction = LoadResString(5235) strRecord = LogPOPRecord(RS) strKey = RS!CityName LogEdit strAction & ", " & strKey & ", " & strRecord End Function Function LogPOPRecord(ByRef RS As Recordset) As String Dim strRecord As String Dim intX As Integer strRecord = RS(0) For intX = 1 To RS.Fields.Count - 2 strRecord = strRecord & ";" & RS(intX) Next LogPOPRecord = strRecord End Function Function LogPublish(ByVal Key As String) As Integer Dim strAction As String strAction = LoadResString(6058) LogEdit strAction & ", " & Key & ", " & gsCurrentPB End Function Function LogRegionAdd(ByVal Key As String, ByVal Record As String) As Integer Dim strAction As String strAction = LoadResString(5230) LogEdit strAction & ", " & Key & ", " & Record End Function Function LogRegionEdit(ByVal Key As String, ByVal Record As String) As Integer Dim strAction As String strAction = LoadResString(5231) LogEdit strAction & ", " & Key & ", " & Record End Function Function LogRegionDelete(ByVal Key As String, ByVal Record As String) As Integer Dim strAction As String strAction = LoadResString(5232) LogEdit strAction & ", " & Key & ", " & Record End Function Function MakeFullINF(ByVal strNewPB As String) As Integer Dim strINFfile As String Dim strTemp As String If CheckPath(locPath & strNewPB) <> 0 Then MkDir locPath & strNewPB End If Exit Function ' we're not doing this anymore - no INFs strINFfile = locPath & strNewPB & "\" & strNewPB & ".inf" If CheckPath(strINFfile) <> 0 Then FileCopy locPath & "fullcab.inf", strINFfile strTemp = Chr(34) & strNewPB & Chr(34) OSWritePrivateProfileString "Strings", "ShortSvcName", strTemp, strINFfile strTemp = strNewPB & ".pbk" & Chr(13) & Chr(10) & strNewPB & ".pbr" OSWritePrivateProfileSection "Install.CopyFiles", strTemp, strINFfile OSWritePrivateProfileString vbNullString, vbNullString, vbNullString, strINFfile End If End Function Function MakeLogFile(ByVal PBName As String) As Integer Dim intFile As Integer Dim strFile As String On Error GoTo MakeFileErr If CheckPath(locPath & PBName) <> 0 Then MkDir locPath & PBName End If intFile = FreeFile strFile = locPath & PBName & "\" & PBName & ".log" If CheckPath(strFile) = 0 Then Kill strFile End If Open strFile For Output As #intFile Print #intFile, LoadResString(5236); ", "; LoadResString(5237) & _ ", "; LoadResString(5238); ", "; LoadResString(5239) Close intFile On Error GoTo 0 Exit Function MakeFileErr: Exit Function End Function Public Function masterOutfile(file As String, ds As Recordset) Dim strTemp As String Dim intFile As Integer intFile = FreeFile Open file For Output As #intFile While Not ds.EOF Print #intFile, Trim(ds!AccessNumberId); ","; Print #intFile, Trim(ds!CountryNumber); ","; If IsNull(ds!RegionID) Then Print #intFile, ""; ","; Else Print #intFile, Trim(ds!RegionID); ","; End If Print #intFile, ds!CityName; ","; Print #intFile, Trim(ds!AreaCode); ","; Print #intFile, Trim(ds!AccessNumber); ","; Print #intFile, Trim(ds!MinimumSpeed); ","; Print #intFile, Trim(ds!MaximumSpeed); ","; Print #intFile, Trim(ds!FlipFactor); ","; Print #intFile, Trim(ds!Flags); ","; If IsNull(ds!ScriptId) Then Print #intFile, "" Else Print #intFile, ds!ScriptId End If ds.MoveNext Wend Close #intFile End Function Public Function deltaoutfile(file As String, ds As Recordset) Dim strTemp As String Dim intFile As Integer intFile = FreeFile Open file For Output As #intFile While Not ds.EOF If ds!CityName = "" Or IsNull(ds!CityName) Then Print #intFile, ds!AccessNumberId; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0"; ","; Print #intFile, "0" Else Print #intFile, Trim(ds!AccessNumberId); ","; Print #intFile, Trim(ds!CountryNumber); ","; If IsNull(ds!RegionID) Then Print #intFile, ""; "0,"; Else Print #intFile, Trim(ds!RegionID); ","; End If Print #intFile, ds!CityName; ","; Print #intFile, Trim(ds!AreaCode); ","; Print #intFile, Trim(ds!AccessNumber); ","; strTemp = Trim(ds!MinimumSpeed) If Val(strTemp) = 0 Then strTemp = "" Print #intFile, strTemp; ","; strTemp = Trim(ds!MaximumSpeed) If Val(strTemp) = 0 Then strTemp = "" Print #intFile, strTemp; ","; Print #intFile, "0"; ","; Print #intFile, Trim(ds!Flags); ","; If IsNull(ds!ScriptId) Then Print #intFile, "" Else Print #intFile, ds!ScriptId End If End If ds.MoveNext Wend Close #intFile End Function Public Function GetINISetting(ByVal section As String, ByVal Key As String) As Variant Dim intFile, intX As Integer Dim strLine, strINIFile As String Dim varTemp(0 To 99, 0 To 1) As Variant On Error GoTo ReadErr GetINISetting = Null intFile = FreeFile strINIFile = locPath & gsRegAppTitle & ".ini" Open strINIFile For Input Access Read As #intFile Do While Not EOF(intFile) Line Input #intFile, strLine strLine = Trim(strLine) If strLine = "[" & section & "]" Then If Key = "" Then 'return all keys intX = 0 Do While Not EOF(intFile) Line Input #intFile, strLine strLine = Trim(strLine) If Left(strLine, 1) <> "[" Then If strLine <> "" And InStr(strLine, "=") <> 0 Then varTemp(intX, 0) = Left(strLine, InStr(strLine, "=") - 1) varTemp(intX, 1) = Right(strLine, Len(strLine) - InStr(strLine, "=")) intX = intX + 1 End If Else Exit Do End If Loop Close #intFile GetINISetting = varTemp Exit Function Else 'return single key Do While Not EOF(intFile) Line Input #intFile, strLine strLine = Trim(strLine) If strLine <> "" Then If Key = Left(strLine, InStr(strLine, "=") - 1) Then GetINISetting = Right(strLine, Len(strLine) - InStr(strLine, "=")) Close #intFile Exit Function ElseIf strLine <> "" And Left(strLine, 1) = "[" Then Close #intFile Exit Function End If End If Loop End If Exit Do End If Loop Close #intFile Exit Function ReadErr: Close #intFile Exit Function End Function Public Function isBitSet(n As Long, i As Integer) As Integer Dim p As Long If i = 31 Then isBitSet = (n < 0) * -1 Else p = 2 ^ i isBitSet = (n And p) / p End If End Function Public Sub CenterForm(C As Object, p As Object) C.Move (p.Width - C.Width) / 2, (p.Height - C.Height) / 2 End Sub Public Function ReIndexRegions(pb As Database) As Boolean Dim rsTemp As Recordset, rsTempPop As Recordset, rsTempDelta As Recordset Dim index As Integer, curindex As Integer, i As Integer, deltnum As Integer Dim strSQL As String, deltasql As String, popsql As String On Error GoTo ReIndexError Set rsTemp = pb.OpenRecordset("Region", dbOpenDynaset) If Not rsTemp.EOF And Not rsTemp.BOF Then rsTemp.MoveFirst index = 1 Do Until rsTemp.EOF curindex = rsTemp!RegionID If curindex <> index Then rsTemp.Edit rsTemp!RegionID = index rsTemp.Update popsql = "Select * from DialUpPort where RegionID = " & curindex Set rsTempPop = pb.OpenRecordset(popsql, dbOpenDynaset) If Not (rsTempPop.BOF And rsTempPop.EOF) Then rsTempPop.MoveFirst Do Until rsTempPop.EOF rsTempPop.Edit rsTempPop!RegionID = index rsTempPop.Update If rsTempPop!status = 1 Then Set rsTempDelta = pb.OpenRecordset("Select * from Delta order by DeltaNum", dbOpenDynaset) If rsTempDelta.RecordCount = 0 Then deltnum = 1 Else rsTempDelta.MoveLast deltnum = rsTempDelta!deltanum If deltnum > 6 Then deltnum = deltnum - 1 End If End If For i = 1 To deltnum deltasql = "Select * from delta where DeltaNum = " & i & _ " AND AccessNumberId = '" & rsTempPop!AccessNumberId & "' " & _ " order by DeltaNum" Set rsTempDelta = pb.OpenRecordset(deltasql, dbOpenDynaset) If Not (rsTempDelta.BOF And rsTempDelta.EOF) Then rsTempDelta.Edit Else rsTempDelta.AddNew rsTempDelta!deltanum = i rsTempDelta!AccessNumberId = rsTempPop!AccessNumberId End If If rsTempPop!status = 1 Then rsTempDelta!CountryNumber = rsTempPop!CountryNumber rsTempDelta!AreaCode = rsTempPop!AreaCode rsTempDelta!AccessNumber = rsTempPop!AccessNumber rsTempDelta!MinimumSpeed = rsTempPop!MinimumSpeed rsTempDelta!MaximumSpeed = rsTempPop!MaximumSpeed rsTempDelta!RegionID = rsTempPop!RegionID rsTempDelta!CityName = rsTempPop!CityName rsTempDelta!ScriptId = rsTempPop!ScriptId rsTempDelta!Flags = rsTempPop!Flags rsTempDelta.Update End If Next i End If rsTempPop.MoveNext Loop End If End If index = index + 1 rsTemp.MoveNext Loop End If ReIndexRegions = True Exit Function ReIndexError: ReIndexRegions = False End Function Public Function RegGetValue(sKeyName As String, sValueName As String) As String Dim lRetVal As Long 'result of the API functions Dim hKey As Long 'handle of opened key Dim vValue As Variant 'setting of queried value lRetVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, _ KEY_ALL_ACCESS, hKey) lRetVal = QueryValueEx(hKey, sValueName, vValue) 'MsgBox vValue RegCloseKey (hKey) RegGetValue = vValue End Function Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _ String, vValue As Variant) As Long Dim cch As Long Dim lrc As Long Dim lType As Long Dim lValue As Long Dim sValue As String On Error GoTo QueryValueExError ' Determine the size and type of data to be read lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch) If lrc <> ERROR_NONE Then Error 5 Select Case lType ' For strings Case REG_SZ: sValue = String(cch, 0) lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch) If lrc = ERROR_NONE Then vValue = Left$(sValue, cch) Else vValue = Empty End If ' For DWORDS Case REG_DWORD: lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch) If lrc = ERROR_NONE Then vValue = lValue Case Else 'all other data types not supported lrc = -1 End Select QueryValueExExit: QueryValueEx = lrc Exit Function QueryValueExError: Resume QueryValueExExit End Function Function CheckPath(ByVal path As String) As Integer 'function returns 0 if path exists Dim intRC As Integer On Error GoTo PathErr If Trim(path) = "" Or IsNull(path) Then CheckPath = 1 Exit Function End If intRC = GetAttr(path) CheckPath = 0 Exit Function PathErr: CheckPath = 1 Exit Function End Function Function SavePOP(ByRef Record As Variant, ByRef dbPB As Database) As Integer ' Handles inserting or updating a POP. ' If Record(0) = "" then generate new AccessNumberID and INSERT. ' Otherwise do like cmdImportRegions; just do an UPDATE and ' then an INSERT. Dim strSQL As String Dim rsPB As Recordset Dim intX, intNewID As Integer Dim bInService As Boolean Dim NewPOP As Recordset Dim deltasql As String Dim deltnum As Integer, i As Integer, addFound As Integer On Error GoTo SaveErr If Record(0) = "" Then Set rsPB = dbPB.OpenRecordset("SELECT max(AccessNumberID) as MaxID from DialUpPort", dbOpenSnapshot) If IsNull(rsPB!maxID) Then intNewID = 1 Else intNewID = rsPB!maxID + 1 End If rsPB.Close Record(0) = intNewID 'try this: edit a referenced array 'INSERT strSQL = GetSQLPOPInsert(Record) dbPB.Execute strSQL Else Set GsysDial = dbPB.OpenRecordset("SELECT * from DialUpPort where AccessNumberID = " & CStr(Record(0)), dbOpenSnapshot) If GsysDial.EOF And GsysDial.BOF Then 'INSERT strSQL = GetSQLPOPInsert(Record) dbPB.Execute strSQL ', dbFailOnError Set GsysDial = dbPB.OpenRecordset("SELECT * from DialUpPort where AccessNumberID = " & CStr(Record(0)), dbOpenSnapshot) LogPOPAdd GsysDial Else 'UPDATE strSQL = GetSQLPOPUpdate(Record) dbPB.Execute strSQL ', dbFailOnError 'INSERT strSQL = GetSQLPOPInsert(Record) dbPB.Execute strSQL ', dbFailOnError Set NewPOP = dbPB.OpenRecordset("SELECT * from DialUpPort where AccessNumberID = " & CStr(Record(0)), dbOpenSnapshot) LogPOPEdit GsysDial!CityName, NewPOP End If End If If UBound(Record) < 14 Then bInService = True ElseIf Record(11) = 1 Then bInService = True Else bInService = False End If If bInService Then ' insert to Delta table if 'In Service' Set GsysDelta = dbPB.OpenRecordset("Select * from Delta order by DeltaNum", dbOpenDynaset) If GsysDelta.RecordCount = 0 Then deltnum = 1 Else GsysDelta.MoveLast deltnum = GsysDelta!deltanum If deltnum > 6 Then deltnum = deltnum - 1 End If End If For i = 1 To deltnum deltasql = "Select * from delta where DeltaNum = " & i% & " order by DeltaNum" Set GsysDelta = dbPB.OpenRecordset(deltasql, dbOpenDynaset) addFound = 0 'initialize delta not found Do While GsysDelta.EOF = False If GsysDelta!AccessNumberId = Record(0) Then addFound = 1 Exit Do Else GsysDelta.MoveNext End If Loop If addFound = 0 Then GsysDelta.AddNew GsysDelta!deltanum = i% GsysDelta!AccessNumberId = Record(0) Else GsysDelta.Edit End If GsysDelta!CountryNumber = Record(1) GsysDelta!AreaCode = Record(4) GsysDelta!AccessNumber = Record(5) GsysDelta!MinimumSpeed = Record(6) GsysDelta!MaximumSpeed = Record(7) GsysDelta!RegionID = Record(2) GsysDelta!CityName = Record(3) GsysDelta!ScriptId = Record(10) GsysDelta!FlipFactor = Record(8) GsysDelta!Flags = Record(9) GsysDelta.Update Next i% End If On Error GoTo 0 Exit Function SaveErr: SavePOP = CInt(Record(0)) Exit Function End Function Function SetFonts(ByRef frmToApply As Form) As Integer Const SYMBOL_CHARSET As Integer = 2 Dim Ctl As Control Dim fnt As tmpFont GetFont fnt If Not TypeOf frmToApply Is MDIForm Then If frmToApply.Font.Charset <> SYMBOL_CHARSET Then If frmToApply.Font.Size >= 8 And frmToApply.Font.Size <= 9 Then frmToApply.Font.Name = fnt.Name frmToApply.Font.Size = fnt.Size frmToApply.Font.Charset = fnt.Charset Else frmToApply.Font.Name = fnt.Name frmToApply.Font.Charset = fnt.Charset End If End If End If On Error Resume Next For Each Ctl In frmToApply.Controls If Ctl.Font.Charset <> SYMBOL_CHARSET Then If Ctl.Font.Size >= 8 And Ctl.Font.Size <= 9 Then Ctl.Font.Name = fnt.Name Ctl.Font.Size = fnt.Size Ctl.Font.Charset = fnt.Charset Else Ctl.Font.Name = fnt.Name Ctl.Font.Charset = fnt.Charset End If End If Next On Error GoTo 0 End Function Function GetLocalPath() As String ' returns short version of local path ' also sets global variable locpath On Error GoTo PathErr 'locPath = GetMyShortPath(Trim(LCase(App.Path))) locPath = Trim(LCase(App.path)) If Right(locPath, 1) <> "\" Then locPath = locPath + "\" End If '''locPath = "c:\\Program Files\\pbantop\\" GetLocalPath = locPath On Error GoTo 0 Exit Function PathErr: GetLocalPath = "" Exit Function End Function Function SplitLine(ByVal Line As String, ByVal Delimiter As String) As Variant ReDim varArray(30) Dim intX As Integer On Error GoTo SplitErr Line = Line & Delimiter intX = 0 ' split out fields - deconstruct Line Do While (InStr(Line, Delimiter) <> 0 & intX < 30) varArray(intX) = Trim(Left(Line, InStr(Line, Delimiter) - 1)) If InStr(Line, Delimiter) + 1 <= Len(Line) Then Line = Right(Line, Len(Line) - InStr(Line, Delimiter)) Else Exit Do End If intX = intX + 1 Loop ReDim Preserve varArray(intX) SplitLine = varArray() On Error GoTo 0 Exit Function SplitErr: SplitLine = 1 Exit Function End Function Function QuietTestNewPBName(ByVal strNewPB As String) As Integer Dim strTemp As String Dim varRegKeys As Variant Dim intX As Integer Dim varTemp As Variant On Error GoTo ErrTrap strNewPB = Trim(strNewPB) If strNewPB = "" Or strNewPB = "empty_pb" Or strNewPB = "pbserver" Then QuietTestNewPBName = 6049 Exit Function Else varTemp = strNewPB If IsNumeric(varTemp) Then QuietTestNewPBName = 6095 Exit Function End If varRegKeys = GetINISetting("Phonebooks", strNewPB) If Not IsNull(varRegKeys) Then QuietTestNewPBName = 6050 Exit Function End If strTemp = locPath & strNewPB & ".mdb" If CheckPath(strTemp) = 0 Then QuietTestNewPBName = 6020 Exit Function End If 'test write access On Error GoTo FileErr Open strTemp For Output As #1 Close #1 Kill strTemp End If QuietTestNewPBName = 0 Exit Function ErrTrap: Exit Function FileErr: QuietTestNewPBName = 6051 Exit Function End Function Function TestNewPBName(ByVal strNewPB As String) As Integer Dim rt As Integer Dim intX As Integer rt = QuietTestNewPBName(strNewPB) If rt <> 0 Then If rt = 6020 Then ' File already exists intX = MsgBox(LoadResString(6020) & Chr(13) & strNewPB & Chr$(13) & _ LoadResString(6021), _ vbQuestion + vbYesNo + vbDefaultButton2) If intX = vbNo Then ' 7 == no TestNewPBName = 1 Exit Function End If End If MsgBox rt, vbExclamation TestNewPBName = 1 Else TestNewPBName = 0 End If End Function Public Sub SelectText(txtBox As Control) txtBox.SelStart = 0 txtBox.SelLength = Len(txtBox.Text) End Sub Public Sub CheckChar(ASCIIChar As Integer) Select Case ASCIIChar Case 34 Beep ASCIIChar = 0 Case 44 Beep ASCIIChar = 0 Case 128 To 159 Beep ASCIIChar = 0 End Select End Sub Public Function CreatePB(ByRef strNewPB As String) As Integer Dim dblFreeSpace As Double Dim rt As Integer dblFreeSpace = GetDriveSpace(locPath, 250000) If dblFreeSpace = -2 Then cmdLogError 6054 CreatePB = -2 Exit Function End If rt = QuietTestNewPBName(strNewPB) If rt = 0 Then 'ok MakeFullINF strNewPB MakeLogFile strNewPB FileCopy locPath & "empty_pb.mdb", locPath & strNewPB & ".mdb" OSWritePrivateProfileString "Phonebooks", strNewPB, strNewPB & ".mdb", locPath & gsRegAppTitle & ".ini" OSWritePrivateProfileString vbNullString, vbNullString, vbNullString, locPath & gsRegAppTitle & ".ini" Else cmdLogError rt CreatePB = -1 End If CreatePB = 0 End Function Public Function SetOptions(strURL As String, strUser As String, strPassword As String) As Integer Dim i As Integer Dim strTemp As String Dim configuration As Recordset On Error GoTo ErrTrap strURL = Trim(strURL) strUser = Trim(strUser) strPassword = Trim(strPassword) If strTemp <> "" Then ' max len 64, alpha, numeric If strUser = "" Or InStr(strUser, " ") Then cmdLogError 6010 SetOptions = 1 Exit Function ' max len 64, alpha, numeric, meta ElseIf strPassword = "" Then cmdLogError 6011 SetOptions = 2 Exit Function End If End If Set configuration = gsyspb.OpenRecordset("Configuration", dbOpenDynaset) If configuration.RecordCount = 0 Then configuration.AddNew Else configuration.Edit End If configuration!index = 1 If strURL <> "" Then configuration!URL = strURL Else configuration!URL = Null End If If strUser <> "" Then configuration!ServerUID = strUser Else configuration!ServerUID = Null End If If strPassword <> "" Then configuration!ServerPWD = strPassword Else configuration!ServerPWD = Null End If configuration!NewVersion = 0 configuration.Update configuration.Close SetOptions = 0 Exit Function ErrTrap: SetOptions = 3 End Function Public Function cmdLogError(ErrorNum As Integer, Optional ErrorMsg As String) Dim intFile As Integer Dim strFile As String On Error GoTo LogErr gCLError = True intFile = FreeFile strFile = locPath & "import.log" Open strFile For Append As #intFile On Error GoTo 0 Print #intFile, Now & ", " & gsCurrentPB & ", " & LoadResString(ErrorNum) & ErrorMsg Close #intFile MsgBox LoadResString(6083) Exit Function LogErr: Exit Function End Function