T r e b a l l d e R e c e r c a
ESTUDIANT
SUITE
La programació client-servidor (Annex 2)
Alumne: Víctor Ariño Pérez Tutor: Josep Carbonell Curs: 2n Btx. (2005 – 2006)
Índex
1 El client 2
2 El servidor 112
7.1 El client
En Visual Basic, els projectes es composen de diversos fitxers de codi font, classificats en formularis, mòduls, controls Active X i d'altres tipus de components. El projecte del client utilitza quatre tipus de fitxers: mòduls de classe, controls Active X, formularis, mòduls i, a més a més i un fitxer de recurs. Els fitxers de recurs no són molt utilitzats en Visual Basic però són de gran utilitat. Un fitxer de recurs consisteix en un fitxer que emmagatzema imatges, text, icones... de manera que, per exemple, per ensenyar, en una finestra, una imatge que és necessària en diverses, no cal generar el programa amb la imatge a cada finestra, simplement ens limitem a dir-li al programa que quan ensenyi la finestra que busqui la imatge que es troba al fitxer de recurs.
De manera que el client està format per:
Mòduls de classe
clsBase64 Hi ha els procediments necessaris per codificar fitxers en base64
clsConnexio Recordar la contrasenya introduïda.
clsINIRutines Conté els procediments per de lectura i escriptura dels fitxers .ini
clsMemoria Conté els procediments de lectura i escriptura de l'historial
“acces.dll”
clsRegistryAccess Conté els procediments per accedir al registre del sistema
Controls Active X
ctrlLinia3D Element que dóna l'efecte d'una línia amb relleu
ctrlLink Element que dóna l'efecte d'un enllaç semblant al de les pàgines web
Formularis
frmAcceptacio Finestra per l'acceptació de fitxers frmActualitzar Finestra per actualitzar fitxers
frmAlert Finestra per ensenyar informació, errors, idees...
frmLogin Finestra d'identificació
frmNotify Finestra amb la llista de les notificacions frmOpcions Finestra de preferències
frmRebre Finestra per veure el procés d'una descàrrega
frmResums Finestra de l'Administrador de Fitxers frmSobre Finestra de crèdits i historial de versions frmSocket Formulari auxiliar amb un control winsock frmSplash Finestra de càrrega
frmSystray Formulari auxiliar per la icona de la safata
frmWzFirstTime Finestra de l'Auxiliar d'execució per primera vegada frmWzNouResum Finestra de l'auxiliar per crear un fitxer nou
Mòduls
mdlDefinicions Mòdul de definició de variables
mdlEstil Mòdul d'estil per sistemes diferents a Windows XP mdlFuncions Mòdul amb funcions vàries
mdlPrincipal Mòdul d'inici del programa
Tipus: Mòdul de classe Nom: clsBase64 Autor: Tim Arheit
Private Const MAX_LINELENGTH As Long = 76 ' Must be a multiple of 4 Private Const CHAR_EQUAL As Byte = 61
Private Const CHAR_CR As Byte = 13 Private Const CHAR_LF As Byte = 10 Private m_Index1(0 To 255) As Byte Private m_Index2(0 To 255) As Byte Private m_Index3(0 To 255) As Byte Private m_Index4(0 To 63) As Byte
Private m_ReverseIndex1(0 To 255) As Byte
Private m_ReverseIndex2(0 To 255, 0 To 1) As Byte Private m_ReverseIndex3(0 To 255, 0 To 1) As Byte Private m_ReverseIndex4(0 To 255) As Byte
' Encode a string to a string.
Public Function Encode(sInput As String) As String Dim bTemp() As Byte
'Convert to a byte array then convert.
'This is faster the repetitive calls to asc() or chr$() bTemp = StrConv(sInput, vbFromUnicode)
Encode = StrConv(EncodeArr(bTemp), vbUnicode) End Function
'Decode a string to a string.
Public Function Decode(sInput As String) As String On Error Resume Next
'Depurar l'error en cas de text nul Decode = ""
If sInput = "" Then Exit Function Dim bTemp() As Byte
'Convert to a byte array then convert.
'This is faster the repetitive calls to asc() or chr$() bTemp = StrConv(sInput, vbFromUnicode)
Decode = StrConv(DecodeArr(bTemp), vbUnicode) If Err.Number = 7 Then
Alert "Error", "Memòria insuficient! El programa es tanctarà per seguretat", IError, UnBoto, vbModal
End End If End Function
Public Sub DecodeToFile(sInput As String, sOutputFile As String) Dim bTemp() As Byte
Dim fh As Long
bTemp = StrConv(sInput, vbformunicode)
bTemp = DecodeArr(bTemp)
fh = FreeFile(0)
Open sOutputFile For Binary Access Write As fh Put fh, , bTemp
Close fh End Sub
Public Sub DecodeFile(sInputFile As String, sOutputFile As String) Dim bTemp() As Byte
Dim fh As Long
fh = FreeFile(0)
Open sInputFile For Binary Access Read As fh ReDim bTemp(0 To LOF(fh) - 1)
Get fh, , bTemp Close fh
bTemp = DecodeArr(bTemp)
Open sOutputFile For Binary Access Write As fh Put fh, , bTemp
Close fh End Sub
Public Function EncodeFromFile(sFileName As String) As String Dim bTemp() As Byte
Dim fh As Long
fh = FreeFile(0)
Open sFileName For Binary Access Read As fh ReDim bTemp(0 To LOF(fh) - 1)
Get fh, , bTemp Close fh
EncodeFromFile = StrConv(EncodeArr(bTemp), vbUnicode) End Function
Public Sub EncodeFile(sInputFile As String, sOutputFile As String) Dim bTemp() As Byte
Dim fh As Long fh = FreeFile(0)
Open sInputFile For Binary Access Read As fh ReDim bTemp(0 To LOF(fh) - 1)
Get fh, , bTemp Close fh
bTemp = EncodeArr(bTemp)
Open sOutputFile For Binary Access Write As fh Put fh, , bTemp
Close fh End Sub
Private Function EncodeArr(bInput() As Byte) As Byte() Dim bOutput() As Byte
Dim k As Long Dim l As Long Dim i As Long
Dim evenBound As Long Dim CurrentOut As Long Dim B As Byte
Dim c As Byte Dim d As Byte
Dim linelength As Long k = LBound(bInput) l = UBound(bInput)
'Calculate the input size i = l - k + 1
'Calculate the output size Select Case i Mod 3
Case 0:
i = (i \ 3) * 4 evenBound = l Case 1:
i = ((i \ 3) * 4) + 4 evenBound = l - 1 Case 2:
i = ((i \ 3) * 4) + 4 evenBound = l - 2 Case 3:
i = ((i \ 3) * 4) + 4 evenBound = l - 3 End Select
'Add in the line feeds.
If i Mod MAX_LINELENGTH = 0 Then
i = i + (i \ MAX_LINELENGTH) * 2 - 2 Else
i = i + (i \ MAX_LINELENGTH) * 2 End If
'Size the output array ReDim bOutput(0 To i - 1)
CurrentOut = 0 linelength = 0
For i = k To evenBound Step 3 B = bInput(i)
c = bInput(i + 1) d = bInput(i + 2)
bOutput(CurrentOut) = m_Index1(B And &HFC)
bOutput(CurrentOut + 1) = m_Index2((B And &H3) Or (c And &HF0)) bOutput(CurrentOut + 2) = m_Index3((c And &HF) Or (d And &HC0)) bOutput(CurrentOut + 3) = m_Index4(d And &H3F)
CurrentOut = CurrentOut + 4 linelength = linelength + 4
If linelength >= MAX_LINELENGTH Then
If i <> l - 2 Then ' If this is the last line, don't add crlf
bOutput(CurrentOut) = CHAR_CR bOutput(CurrentOut + 1) = CHAR_LF End If
CurrentOut = CurrentOut + 2 linelength = 0
End If Next i
Select Case l - i Case 1:
B = bInput(i) c = bInput(i + 1) d = 0
bOutput(CurrentOut) = m_Index1(B And &HFC)
bOutput(CurrentOut + 1) = m_Index2((B And &H3) Or (c And
&HF0))
bOutput(CurrentOut + 2) = m_Index3((c And &HF) Or (d And
&HC0))
bOutput(CurrentOut + 3) = CHAR_EQUAL CurrentOut = CurrentOut + 4
linelength = linelength + 4 Case 0:
B = bInput(i) c = 0
bOutput(CurrentOut) = m_Index1(B And &HFC)
bOutput(CurrentOut + 1) = m_Index2((B And &H3) Or (c And
&HF0))
bOutput(CurrentOut + 2) = CHAR_EQUAL bOutput(CurrentOut + 3) = CHAR_EQUAL CurrentOut = CurrentOut + 4
linelength = linelength + 4 End Select
EncodeArr = bOutput End Function
Private Function DecodeArr(bInput() As Byte) As Byte() Dim bOutput() As Byte
Dim OutLength As Long Dim CurrentOut As Long Dim k As Long
Dim l As Long Dim i As Long Dim j As Long
Dim B As Byte Dim c As Byte Dim d As Byte Dim e As Byte
k = LBound(bInput) l = UBound(bInput)
'Calculate the length of the input i = l - k + 1
'Calculate the expected length of the output 'It should be no more (but may possible be less) j = i Mod (MAX_LINELENGTH + 2)
If j = 0 Then
OutLength = (i \ (MAX_LINELENGTH + 2)) * (MAX_LINELENGTH \ 4) * 3
Else
j = (j / 4) * 3
If bInput(l) = CHAR_EQUAL Then j = j - 1 If bInput(l - 1) = CHAR_EQUAL Then j = j - 1
OutLength = (i \ (MAX_LINELENGTH + 2)) * (MAX_LINELENGTH \ 4) * 3 + j
End If
If OutLength = 0 Then Exit Function
'Allocate the output
ReDim bOutput(0 To OutLength - 1) CurrentOut = 0
For i = k To l
Select Case bInput(i) Case CHAR_CR
'Do nothing Case CHAR_LF 'Do nothing Case Else
If l - i >= 3 Then B = bInput(i) c = bInput(i + 1) d = bInput(i + 2) e = bInput(i + 3)
If e <> CHAR_EQUAL Then
bOutput(CurrentOut) = m_ReverseIndex1(B) Or m_ReverseIndex2(c, 0)
bOutput(CurrentOut + 1) = m_ReverseIndex2(c, 1) Or m_ReverseIndex3(d, 0)
bOutput(CurrentOut + 2) = m_ReverseIndex3(d, 1) Or m_ReverseIndex4(e)
CurrentOut = CurrentOut + 3 i = i + 3
ElseIf d <> CHAR_EQUAL Then
bOutput(CurrentOut) = m_ReverseIndex1(B) Or m_ReverseIndex2(c, 0)
bOutput(CurrentOut + 1) = m_ReverseIndex2(c, 1) Or m_ReverseIndex3(d, 0)
CurrentOut = CurrentOut + 2 i = i + 3
Else
bOutput(CurrentOut) = m_ReverseIndex1(B) Or m_ReverseIndex2(c, 0)
CurrentOut = CurrentOut + 1
i = i + 3 End If
Else
'Possible input code error, but may also be 'an extra CrLf, so we will ignore it.
End If End Select Next i
On Error Resume Next
'On properly formed input we should have to do this.
If OutLength <> CurrentOut + 1 Then
ReDim Preserve bOutput(0 To CurrentOut - 1) End If
DecodeArr = bOutput End Function
Private Sub Class_Initialize() Dim i As Long
'Setup the encodeing and decoding lookup arrays.
'Essentially we speed up the routine by pre-shifting 'the data so it only needs combined with And and Or.
m_Index4(0) = 65 'Asc("A") m_Index4(1) = 66 'Asc("B") m_Index4(2) = 67 'Asc("C") m_Index4(3) = 68 'Asc("D") m_Index4(4) = 69 'Asc("E") m_Index4(5) = 70 'Asc("F") m_Index4(6) = 71 'Asc("G") m_Index4(7) = 72 'Asc("H") m_Index4(8) = 73 'Asc("I") m_Index4(9) = 74 'Asc("J") m_Index4(10) = 75 'Asc("K") m_Index4(11) = 76 'Asc("L") m_Index4(12) = 77 'Asc("M") m_Index4(13) = 78 'Asc("N") m_Index4(14) = 79 'Asc("O") m_Index4(15) = 80 'Asc("P") m_Index4(16) = 81 'Asc("Q") m_Index4(17) = 82 'Asc("R") m_Index4(18) = 83 'Asc("S") m_Index4(19) = 84 'Asc("T") m_Index4(20) = 85 'Asc("U") m_Index4(21) = 86 'Asc("V") m_Index4(22) = 87 'Asc("W") m_Index4(23) = 88 'Asc("X") m_Index4(24) = 89 'Asc("Y") m_Index4(25) = 90 'Asc("Z") m_Index4(26) = 97 'Asc("a") m_Index4(27) = 98 'Asc("b") m_Index4(28) = 99 'Asc("c") m_Index4(29) = 100 'Asc("d")
m_Index4(30) = 101 'Asc("e") m_Index4(31) = 102 'Asc("f") m_Index4(32) = 103 'Asc("g") m_Index4(33) = 104 'Asc("h") m_Index4(34) = 105 'Asc("i") m_Index4(35) = 106 'Asc("j") m_Index4(36) = 107 'Asc("k") m_Index4(37) = 108 'Asc("l") m_Index4(38) = 109 'Asc("m") m_Index4(39) = 110 'Asc("n") m_Index4(40) = 111 'Asc("o") m_Index4(41) = 112 'Asc("p") m_Index4(42) = 113 'Asc("q") m_Index4(43) = 114 'Asc("r") m_Index4(44) = 115 'Asc("s") m_Index4(45) = 116 'Asc("t") m_Index4(46) = 117 'Asc("u") m_Index4(47) = 118 'Asc("v") m_Index4(48) = 119 'Asc("w") m_Index4(49) = 120 'Asc("x") m_Index4(50) = 121 'Asc("y") m_Index4(51) = 122 'Asc("z") m_Index4(52) = 48 'Asc("0") m_Index4(53) = 49 'Asc("1") m_Index4(54) = 50 'Asc("2") m_Index4(55) = 51 'Asc("3") m_Index4(56) = 52 'Asc("4") m_Index4(57) = 53 'Asc("5") m_Index4(58) = 54 'Asc("6") m_Index4(59) = 55 'Asc("7") m_Index4(60) = 56 'Asc("8") m_Index4(61) = 57 'Asc("9") m_Index4(62) = 43 'Asc("+") m_Index4(63) = 47 'Asc("/") 'Calculate the other Arrays For i = 0 To 63
m_Index1((i * 4) And &HFC) = m_Index4(i)
m_Index2(((i And &HF) * 16) Or ((i And &H30) \ 16)) = m_Index4(i)
m_Index3((i \ 4 And &HF) Or ((i And &H3) * 64)) = m_Index4(i) Next i
m_ReverseIndex4(65) = 0 'Asc("A") m_ReverseIndex4(66) = 1 'Asc("B") m_ReverseIndex4(67) = 2 'Asc("C") m_ReverseIndex4(68) = 3 'Asc("D") m_ReverseIndex4(69) = 4 'Asc("E") m_ReverseIndex4(70) = 5 'Asc("F") m_ReverseIndex4(71) = 6 'Asc("G") m_ReverseIndex4(72) = 7 'Asc("H") m_ReverseIndex4(73) = 8 'Asc("I") m_ReverseIndex4(74) = 9 'Asc("J") m_ReverseIndex4(75) = 10 'Asc("K") m_ReverseIndex4(76) = 11 'Asc("L") m_ReverseIndex4(77) = 12 'Asc("M")
m_ReverseIndex4(78) = 13 'Asc("N") m_ReverseIndex4(79) = 14 'Asc("O") m_ReverseIndex4(80) = 15 'Asc("P") m_ReverseIndex4(81) = 16 'Asc("Q") m_ReverseIndex4(82) = 17 'Asc("R") m_ReverseIndex4(83) = 18 'Asc("S") m_ReverseIndex4(84) = 19 'Asc("T") m_ReverseIndex4(85) = 20 'Asc("U") m_ReverseIndex4(86) = 21 'Asc("V") m_ReverseIndex4(87) = 22 'Asc("W") m_ReverseIndex4(88) = 23 'Asc("X") m_ReverseIndex4(89) = 24 'Asc("Y") m_ReverseIndex4(90) = 25 'Asc("Z") m_ReverseIndex4(97) = 26 'Asc("a") m_ReverseIndex4(98) = 27 'Asc("b") m_ReverseIndex4(99) = 28 'Asc("c") m_ReverseIndex4(100) = 29 'Asc("d") m_ReverseIndex4(101) = 30 'Asc("e") m_ReverseIndex4(102) = 31 'Asc("f") m_ReverseIndex4(103) = 32 'Asc("g") m_ReverseIndex4(104) = 33 'Asc("h") m_ReverseIndex4(105) = 34 'Asc("i") m_ReverseIndex4(106) = 35 'Asc("j") m_ReverseIndex4(107) = 36 'Asc("k") m_ReverseIndex4(108) = 37 'Asc("l") m_ReverseIndex4(109) = 38 'Asc("m") m_ReverseIndex4(110) = 39 'Asc("n") m_ReverseIndex4(111) = 40 'Asc("o") m_ReverseIndex4(112) = 41 'Asc("p") m_ReverseIndex4(113) = 42 'Asc("q") m_ReverseIndex4(114) = 43 'Asc("r") m_ReverseIndex4(115) = 44 'Asc("s") m_ReverseIndex4(116) = 45 'Asc("t") m_ReverseIndex4(117) = 46 'Asc("u") m_ReverseIndex4(118) = 47 'Asc("v") m_ReverseIndex4(119) = 48 'Asc("w") m_ReverseIndex4(120) = 49 'Asc("x") m_ReverseIndex4(121) = 50 'Asc("y") m_ReverseIndex4(122) = 51 'Asc("z") m_ReverseIndex4(48) = 52 'Asc("0") m_ReverseIndex4(49) = 53 'Asc("1") m_ReverseIndex4(50) = 54 'Asc("2") m_ReverseIndex4(51) = 55 'Asc("3") m_ReverseIndex4(52) = 56 'Asc("4") m_ReverseIndex4(53) = 57 'Asc("5") m_ReverseIndex4(54) = 58 'Asc("6") m_ReverseIndex4(55) = 59 'Asc("7") m_ReverseIndex4(56) = 60 'Asc("8") m_ReverseIndex4(57) = 61 'Asc("9") m_ReverseIndex4(43) = 62 'Asc("+") m_ReverseIndex4(47) = 63 'Asc("/")
'Calculate the other arrays.
For i = 0 To 255
If m_ReverseIndex4(i) <> 0 Then
m_ReverseIndex1(i) = m_ReverseIndex4(i) * 4
m_ReverseIndex2(i, 0) = m_ReverseIndex4(i) \ 16
m_ReverseIndex2(i, 1) = (m_ReverseIndex4(i) And &HF) * 16
m_ReverseIndex3(i, 0) = m_ReverseIndex4(i) \ 4
m_ReverseIndex3(i, 1) = (m_ReverseIndex4(i) And &H3) * 64 End If
Next i End Sub
Tipus: Mòdul de classe Nom: clsConnexio Autor: Víctor Ariño
'Variables de informació del servidor Public ServerAddr As String
Public ServerPort As Long 'VarsCheckConn
Public TestServAddr As String Public TestServPort As Long 'Per poder esperar una resposta
Private IntentConnexio As EIntentConnexio
'Per indicar la posició en el procés de connexió Private ProcesConnexio As EProcesConnexio
'Per saber si està connectat o on Private bConnectat As Boolean
'Possibles estats de l'inici de la connexió Private Enum EIntentConnexio
ICEsperant = 0 ICError = 1 ICConnectat = 2 ICResposta = 2 End Enum
'Fases de la connexió
Private Enum EProcesConnexio PCComprovantConnexio = 0 PCBuscantServidor = 1 PCIdentificant = 2 PCSincronitzar = 3 End Enum
'Missatges del Servidor
Private sServMiss(1) As String Private sServErrMsg As String 'Variables de descàrrega/pujada Private iNumTotalPaquets As Long Private iNumPaquetActual As Long Private iTransferNum As Integer Private sArxNom As String
Private bActualitzacio As Boolean
'Controls del WinSock
Private WithEvents WinSock As MSWinsockLib.WinSock
Private Sub Class_Initialize()
'Configurar el control winsock com un de físic Set WinSock = frmSocket.WinSck
'Situar l'adreça del servidor amb una per defecte ServerAddr = "xpixl.no-ip.org"
'Situar el port del servidor amb un per defecte ServerPort = 2156
'Posar l'intent de connexió a ESPERANT IntentConnexio = ICEsperant
'Posar l'estat de connexió a desconnectat bConnectat = False
'Variables del test
TestServAddr$ = "www.yahoo.es"
TestServPort = 80 End Sub
Public Function GetServerInfo() As String
'Intent de connexió a esperar IntentConnexio = ICEsperant
WinSock.SendData "SYSTEM" & vbCrLf & _ "GETINFO" & vbCrLf & _ "1"
Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no està
'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
If IntentConnexio = ICError Then
GetServerInfo = "No s'ha pogut obtenir la informació del servidor. Intent-ho més tard..."
Exit Function End If
'Variable amb la informació:
' sServMiss (1)
GetServerInfo = sServMiss(1) End Function
Public Sub CancelProc(Procediment As eCancelProc)
If Procediment = CP_Rebre_Resum Then
'Avisar al servidor que s'ha de cancel·lar l'enviament WinSock.SendData "RESUMS" & vbCrLf & _
"DESC" & vbCrLf & _ "CANCEL"
End If
End Sub
Public Sub ActualitzarArxiu(iResumID As Integer, sRuta As String)
' WinSock.SendData "SYSTEM" & vbCrLf & _ "PENALITZAR" & vbCrLf & _ sNomUsuari & vbCrLf & _ iPunts
End Sub
Public Sub Penalitzar(sUsuari As String, iPunts As Byte)
WinSock.SendData "SYSTEM" & vbCrLf & _ "PENALITZAR" & vbCrLf & _ sNomUsuari & vbCrLf & _ iPunts
End Sub
Public Sub PuntuarResum(resumID As Integer, iPunts As Byte)
WinSock.SendData "RESUMS" & vbCrLf & _ "VOTE" & vbCrLf & _ resumID & vbCrLf & _ iPunts
End Sub
Public Sub AcceptacioArxiu(resumID As Integer, bAcceptat As Boolean) WinSock.SendData "RESUMS" & vbCrLf & _
"VOTE" & vbCrLf & _ resumID & vbCrLf & _
IIf(bAcceptat = True, "TRUE", "FALSE") End Sub
Public Function DescArxiu(ID As Integer) As Boolean
'Intent de connexió a esperar IntentConnexio = ICEsperant
'Demanar la ID al servidor
WinSock.SendData "RESUMS" & vbCrLf & _ "DESC" & vbCrLf & _ ID
Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no
està 'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
If IntentConnexio = ICError Then
Alert "Descarregar Arxiu", "No s'ha pogut descaregar l'arxiu.
Missatge del servidor:" & vbCrLf & sServErrMsg, IError, UnBoto, vbModal, frmRebre, True
frmRebre.Error End If
End Function
Public Function ConnectarServer() As Boolean IntentConnexio = ICEsperant
'FASE 1: COMPROVAR QUE HI HA CONNEXIÓ A INTERNET ProcesConnexio = PCComprovantConnexio
WinSock.Close
WinSock.Connect TestServAddr$, TestServPort DoEvents
Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no està
'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
'Si ha sorgit un error retornar FALSE i cancelar la connexió If IntentConnexio = ICError Then
ConnectarServer = False
Alert "Connexió a la xarxa", "No s'ha pogut connectar a internet. Pot ésser degut a que el servidor de comprovació (" & _
TestServAddr & ":" & CStr(TestServPort) & ") estigui inactiu. Si hi ha una connexió establerta amb internet si et plau " &
_
"canvia el valor del servidor de comprovació a les opcions del programa per un d'operatiu", IAtencio, UnBoto, vbModal, , True
Exit Function End If
WinSock.Close
IntentConnexio = ICEsperant
'FASE 2: COMPROVAR QUE EL SERVIDOR ESTÀ ACTIU ProcesConnexio = PCBuscantServidor
WinSock.Connect ServerAddr$, ServerPort DoEvents
Do While IntentConnexio = ICEsperant DoEvents
Loop
'Si ha sorgit un error retornar FALSE i cancelar la connexió If IntentConnexio = ICError Then
ConnectarServer = False
Alert "Connexió a la xarxa", "No s'ha pogut connectar al servidor però la connexió a la xarxa funciona correctament. És
possible que el " & _
"servidor es trobi inactiu." & vbCrLf & "Servidor: "
& ServerAddr & vbCrLf & "Port: " & CStr(ServerPort), IAtencio, UnBoto, vbModal, , True
Exit Function
ElseIf IntentConnexio = ICConnectat Then
'Esperar al missatge de benvinguda Do While sServMiss(0) = ""
DoEvents Loop
'Si el missatge és de benvinguda If sServMiss(0) = "WELCOME" Then ConnectarServer = True
bConnectat = True End If
End If
End Function
Public Sub Desconnectar() WinSock.Close
bConnectat = False End Sub
Public Function RecordarDades(seMail As String) As Boolean
'Enviar missatge al servidor per tal que envii un correu al lloc indicat
RecordarDades = False
With WinSock
'Tancar la connexió i connectar .Close
.Connect ServerAddr$, ServerPort
'Esperar que es connecti
Do While IntentConnexio = ICEsperant DoEvents
Loop
'Si s'ha pogut connectar enviar el missatge i desconnectar If IntentConnexio = ICConnectat Then
.SendData "SYST|SENDMAIL|" & seMail RecordarDades = True
End If
.Close
End With
End Function
Public Function Identificar(ByRef sUsuari As String, ByRef sContrassenya As String) As Boolean
Dim sDadesRebudes As String 'Variable per enmagatzemar les dades rebudes
Dim aDadesSeparades As Variant 'Var. per separar la matriu de dades rebudes
Dim sTmp As String
'Si no està connectat torna l'identificació com a error i surt If bConnectat = False Then
Identificar = False
Alert "No estàs connectat", "No estàs connectat amb el servidor. No es pot dur a terme el procés d'identificació", _ IError, vbModal
GoTo DestruirVariables End If
With WinSock
'FASE 3: ENVIAR REFERENCIA DEL PROG, VERSIÓ, USUARI I CONTRASSENYA
ProcesConnexio = PCIdentificant
'Es posa l'intent de connexió a ESPERANT per utilitzar el bucle d'espera
IntentConnexio = ICEsperant
'Enviar les dades ' Format del paquet '
' SYSTEM ' IDENTIFY ' Nom d'usuari ' Contrassenya '
If .State <> 7 Then Exit Function
.SendData "SYSTEM" & vbCrLf & _ "IDENTIFY" & vbCrLf & _ sUsuari & vbCrLf & _ sContrassenya
'Esperar que el servidor respongui (bucle d'espera) Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no està
'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
'Si el servidor respon un error If IntentConnexio = ICError Then Identificar = False
.Close
sTmp = "No s'ha pogut identificar correctament. És possible que l'usuari o la contrassenya siguin incorrectes. " & _ "Verifica la ortografia i tingues en compte que la identificació és sensible a majúscules i minúscules"
'Si el missatge és que existeix...
If sServMiss(1) = "EXISTEIX" Then sTmp = "Hi ha un altre usuari connectat amb el mateix nom d'usuari en aquest moment. No ha estat possible la connexió"
'Alertar a l'usuari que la identificació no ha estat correcta
Alert "Log-in", sTmp, IError, UnBoto
'Buida la variable usuari sNomUsuari = ""
'Si el servidor respon amb dades afirmatives ' posar com a Vertader l'identificació
ElseIf IntentConnexio = ICResposta Then Identificar = True
'Varible global amb el nom d'usuari sNomUsuari = sUsuari
End If
End With
'Aquest procés destrueix les variables de manera que resideix la informació
' en memòria el menor temps possible.
DestruirVariables:
sDadesRebudes = ""
Set aDadesSeparades = Nothing
End Function
Public Function SincroDades(iAssigID As Integer) As Boolean
'Si no està connectat torna l'identificació com a error i surt If bConnectat = False Then
SincroDades = False
Alert "No estàs connectat", "No estàs connectat amb el servidor. No es pot dur a terme la sincronització", _
IError, vbModal Exit Function
End If
'Posar la imatge de carregar
frmResums.picLoading.Visible = True With WinSock
'FASE 4: DEMANAR LA SINCRONITZACIÓ DE DADES ProcesConnexio = PCSincronitzar
'Es posa l'intent de connexió a ESPERANT per utilitzar el bucle d'espera
IntentConnexio = ICEsperant
'Enviar Paquet '
' RESUMS ' SYNCRO
' Assignatura ID '
If .State = 0 Then Desconnectar Exit Function End If
.SendData "RESUMS" & vbCrLf & _ "SYNCRO" & vbCrLf & _ iAssigID
'Esperar que el servidor respongui (bucle d'espera) Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no està
'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
'Si el servidor respon un error
If IntentConnexio = ICError Then SincroDades = False
.Close End If
End With
frmResums.picLoading.Visible = False
End Function
Public Sub PujarArxiu(Optional sTitol As String, Optional sAssignaturaID As Integer, _
Optional sRutaTemporal As String, Optional bLock As Boolean, _ Optional iResUpdID As Integer = -1)
Dim iTmpFile As Integer Dim iTmp As Integer Dim sTmp As String Dim sTmpLinia As String
'VARIABLE DE PROCÉS: esperant IntentConnexio = ICEsperant
'Calcular el num de paquets iTmp = CountLines(sRutaTemporal)
If Not iTmp Mod 35 = 0 And Not (iTmp / 35) < 1 Then iTmp = Round(iTmp / 35) + 1
Else
iTmp = Round(iTmp / 35)
If (iTmp / 35) < 1 Then iTmp = 1 End If
'Definir les variables del servidor iNumTotalPaquets = iTmp
iNumPaquetActual = 0 iTransferNum = FreeFile sArxNom = sRutaTemporal
Open sRutaTemporal For Input Access Read Lock Read Write As
#iTransferNum
'Enviar una petició al servidor '
' [i]RESUMS ' [i]UPLOAD ' [0]INFO
' [1]Actualitz(bool)
' [2]Títol | [2]ResumID ' [3]Autor | [3]NomUsuari ' [4]NumPaquets | [4]NumPaquets ' [5]Assignatura(0-25) |
' [6]Locked(bool) |
'Crear paquet segons si és per actualitzar o per crear-ne un de nou If iResUpdID = -1 Then
WinSock.SendData "RESUMS" & vbCrLf & _ "UPLOAD" & vbCrLf & _ "INFO" & vbCrLf & _ False & vbCrLf & _ sTitol & vbCrLf & _ sNomUsuari & vbCrLf & _ iTmp & vbCrLf & _
sAssignaturaID & vbCrLf & _ bLock & vbCrLf
bActualitzacio = False Else
WinSock.SendData "RESUMS" & vbCrLf & _ "UPLOAD" & vbCrLf & _ "INFO" & vbCrLf & _ True & vbCrLf & _ iResUpdID & vbCrLf & _ sNomUsuari & vbCrLf & _ iTmp
bActualitzacio = True End If
'Esperar que el servidor respongui (bucle d'espera) Do While IntentConnexio = ICEsperant
' Falta codi pel temps d'espera ja que pot ser q el servidor rebi el
'missatge però no contesti potser pq s'ha penjat, potser pq el paquet
'ha estat robat...
' En la primer connexió no passa ja que la connexió encara no està
'establerta i per tant el control ja posa un TIME_OUT automàtic per
'evitar aquest error.
DoEvents Loop
'ERROR
If IntentConnexio = ICError Then
Alert "Afegir Resum Nou", "S'ha produït un error al enviar la petició al servidor. Torna-ho a intentar més tard. Si el problema continua contacta amb l'administrador", IError
Exit Sub End If
End Sub
Public Property Get Connectat() As Boolean Connectat = bConnectat
End Property
Public Property Get RemoteHost() As String
RemoteHost = WinSock.RemoteHostIP End Property
Private Sub WinSock_Close()
'Situar la variable com a desconnectada bConnectat = False
'Buidar la variable amb el nom d'usuari sNomUsuari = ""
'Avisar i desconnectar
Alert "Desconnexió", "Per motius no especificats s'ha tancat la connexió." & vbCrLf & _
"Contacta amb l'administrador del servidor", IError, UnBoto, vbModal, frmResums, True
'Descarregar el formulari de resums i ensenyar el de login Unload frmResums
Load frmLogin frmLogin.Show End Sub
Private Sub WinSock_Connect()
'Situar la variable com a Connectada bConnectat = True
'Posar la variable de l'estat de l'intent de connexió a CONNECTAT IntentConnexio = ICConnectat
End Sub
Private Sub WinSock_DataArrival(ByVal bytesTotal As Long)
'On Error GoTo Final_Error
Dim iTmp As Integer
Dim tmpPaquet As Variant, tmpResum As Variant Dim iTmp2 As Integer
Dim sFBuffer As String, sTmp As String
'Rebre el paquet
Dim Paquet_Cad As String, Paquet As Variant
Debug.Print WinSock.State
'Obtenció del paquet. Estructura:
'
' DESTÍ
' PARAMETRE(S) ' MISSATGE '
WinSock.GetData Paquet_Cad
'Dividir un paquet en tres cadenes Paquet = Split(Paquet_Cad, vbCrLf, 3)
Debug.Print Paquet_Cad
If Paquet_Cad = "" Then
sServErrMsg = "S'ha produït un error en la recepció del servidor..."
GoTo Final_Error End If
'Actuar segons el paquet Select Case Paquet(0)
'Paquet de sistema Case "SYSTEM"
tmpPaquet = Split(Paquet(2), vbCrLf)
Select Case Paquet(1) 'Paquet de benvinguda Case "WELCOME"
'El servidor està ple
If tmpPaquet(0) = "SERVER_FULL" Then
'Avisar l'usuari
Alert "Connexió", "El servidor al que intentes
connectar està ple. Intenta-ho més tard...", IError, UnBoto, vbModal, , False
'La connexió ha estat un error IntentConnexio = ICError
'Sortir del procediment Exit Sub
'La IP està Bannejada
ElseIf tmpPaquet(0) = "IP_BAN" Then
'Avisar l'usuari
Alert "Connexió", "La teva IP està bannejada. És possible que hagis intentat identificar-te massa vegades
incorrectament. " & _
"Si has oblidat l'usuari o la contrassenya contacta amb l'administrador del servidor:" & vbCrLf & _
tmpPaquet(2), IError, UnBoto, vbModal, , False
'La connexió ha estat un error IntentConnexio = ICError
'Sortir del procediment Exit Sub
Else
'El tmpPaquet(1) és el correu de l'administrador sServerAdminMail = tmpPaquet(1)
IntentConnexio = ICConnectat
End If
'El servidor espera l'identificació
'Paquet d'identificació Case "IDENTIFY"
tmpPaquet = Split(Paquet(2), vbCr)
If Not tmpPaquet(0) = "OK" Then
'No s'ha identificat correctament IntentConnexio = ICError
GoTo Proc_MsgServer
Else
'Carregar els crèdits '
' SYSTEM -> Paquet(0) ' IDENTIFY -> Paquet(1) ' OK/FAIL -> tmpPaquet(0) ' numDescarregues -> tmpPaquet(1) ' numModificacions -> tmpPaquet(2) ' numAutories -> tmpPaquet(3) ' numExtres -> tmpPaquet(4) ' numCreditInicial -> tmpPaquet(5) '
iDescarregues = CInt(tmpPaquet(1)) iModificacions = CInt(tmpPaquet(2)) iAutories = CInt(tmpPaquet(3)) iCreditExtra = CInt(tmpPaquet(4)) iCreditInicial = CInt(tmpPaquet(5))
End If
Case "SERVERINFO"
'No cal fer res, la variable sServMiss(1) obtindrà la informació del servidor
' només cal processar-la al procediment
Case "NOTIFY"
tmpPaquet = Split(Paquet(2), vbCrLf)
AfegirNotify CByte(tmpPaquet(0)), CStr(tmpPaquet(1))
End Select
Case "RESUMS"
'Quin és el paquet Select Case Paquet(1)
'Sincronitzar la llista Case "SYNCRO"
'Estructura paquets rebuts '
' RESUMS ' SYNCRO
'[i]Nom & vbLf & Autor... & vbCr & Nom....
'[0]Nom '[1]Autor
'[2]DataCreació '[3]nºModif '[4]Descarregues '[5]INDEX
'[6]Puntuacio '[7]Vots '[8]Locked
'[9]EsperantAccept
'Obtenir el número de resums
tmpPaquet = Split(Paquet(2), vbCr)
'Stop
'Si no n'hi ha cap
If UBound(tmpPaquet) = -1 Then
'Redimensionar eliminant les dades ReDim llistaResums(0 To 9, 0) 'Netejar la matriu
Erase llistaResums 'Sortir del procediment GoTo Proc_OK
End If
'Incrementar la longitud de la matriu
ReDim llistaResums(0 To 9, 0 To UBound(tmpPaquet))
iTmp = 0
Do While iTmp < UBound(tmpPaquet) 'Separar dades de cada resum
tmpResum = Split(tmpPaquet(iTmp), vbLf)
'Assignar a cada variable un valor iTmp2 = 0
Do While iTmp2 <= 9
'Assignar a la llista de resums del programa ' la informació sobre aquest en concret llistaResums(iTmp2, iTmp) = tmpResum(iTmp2)
'Incrementar la variable temporal Sumar iTmp2, 1
Loop
'Descodificar la icona '[0]Nom
'[1]Autor
'[2]DataCreació '[3]nºModif '[4]Descarregues '[5]INDEX
'[6]Puntuacio '[7]Vots '[8]Locked
'[9]EsperantAccept
Dim iPunts As Integer Dim sIcona As String
'Icona per defecte sIcona = "NORMAL"
'Primer comprovar si és nou
If GetArxInfo(iTmp, GetREsperantAccept) = True Then sIcona = "PENDING"
Else
'Comprovar la puntuació iPunts = 0
If Not GetArxInfo(iTmp, GetRNumVots) = 0 Then iPunts = GetArxInfo(iTmp, GetRPuntuacio) / GetArxInfo(iTmp, GetRNumVots)
If iPunts <= 1 Then sIcona = "DOLENT"
ElseIf iPunts <= 3 Then sIcona = "MITG"
Else
sIcona = "BO"
End If Else
'Comprovar si està bloquejat
If GetArxInfo(iTmp, GetRLocked) = True Then sIcona = "LOCKED"
End If End If
'Afegir el Nom del resum a la llista sense l'extensió frmResums.lstFitxers.ListItems.Add , ,
Left(tmpResum(0), InStrRev(tmpResum(0), ".") - 1), sIcona
'Incrementar la variable temporal Sumar iTmp, 1
Loop
Case "UPLOAD"
tmpPaquet = Split(Paquet(2), vbCrLf)
On Error Resume Next
'Obtenir 35 linies For iTmp = 1 To 35
Line Input #iTransferNum, sFBuffer
'És que s'ha arribat al final de l'arxiu
If Not Err.Number > 0 Then sTmp = sTmp & sFBuffer &
vbCrLf
Next iTmp
'Eliminar l'últim salt de linia sTmp = Left(sTmp, Len(sTmp) - 2)
'Enviar la informació
WinSock.SendData "RESUMS" & vbCrLf & _ "UPLOAD" & vbCrLf & _ sTmp
Sumar iNumPaquetActual, 1
'Modificar el procés
If bActualitzacio = False Then
frmWzNouResum.ProcesModificat iNumPaquetActual, iNumTotalPaquets
Else
frmActualitzar.ProcesModificat iNumPaquetActual, iNumTotalPaquets
End If
'S'ha acabat l'enviament
If iNumPaquetActual = iNumTotalPaquets Then 'Tancar l'arxiu
Close #iTransferNum
'Modificar el procés
If bActualitzacio = False Then
frmWzNouResum.UploadFinalitzada sArxNom Else
frmActualitzar.UploadFinalitzada sArxNom End If
End If
'Si s'ha demanar descarregar un arxiu Case "DESC"
Dim paquetTmp As Variant
'Condicional per solucionar problema
If Not InStr(1, Paquet(2), vbCrLf) = 0 Then
'Dividir el 3r paquet, si existeixen salts de linia paquetTmp = Split(Paquet(2), vbCrLf)
Else
ReDim paquetTmp(0) paquetTmp(0) = ""
End If
Select Case paquetTmp(0)
'S'ha produït un error de descàrrega i el motiu Case "ERROR"
'Assignar el missatge d'error sServErrMsg = paquetTmp(1)
'error en la connexio IntentConnexio = ICError
'Sortir del sub Exit Sub
'Comprovar si és el primer paquet Case "INFO"
If paquetTmp(1) = "PRIMER" Then
'Número total de paquets
iNumTotalPaquets = paquetTmp(2) 'Número de paquet actual
iNumPaquetActual = 0
'Número d'arxiu de descàrrega iTransferNum = FreeFile
'Demanar el primerpaquet
WinSock.SendData "RESUMS" & vbCrLf & _ "DESC" & vbCrLf & _ iNumPaquetActual
'Generar nom d'arxiu
sArxNom = "temp" & Chr(Round(Int((90 - 65 + 1) * Rnd + 65)))
'Obrir el arxiu
Open App.path & "\" & sArxNom For Output Access Write Lock Read Write As iTransferNum
End If
'Anar al final del procés GoTo Proc_OK
Case Else
'Rebre dades
Print #iTransferNum, Paquet(2)
'Augmentar paquet actual Sumar iNumPaquetActual, 1
If iNumPaquetActual <= iNumTotalPaquets Then 'Demanar següent paquet
WinSock.SendData "RESUMS" & vbCrLf & _ "DESC" & vbCrLf & _ iNumPaquetActual
frmRebre.ProcesModificat iNumPaquetActual, iNumTotalPaquets
Else
'S'ha acabat de rebre el paquet per tant tancar i completar el procediment
'Tancar arxiu Close iTransferNum
'Avisar aque s'ha acabat
frmRebre.DescarregaFinalitzada sArxNom
'Avisar de la finalització
WinSock.SendData "RESUMS" & vbCrLf & _ "DESC" & vbCrLf & _ "FINAL"
'Esborrar contingut de les variables iTransferNum = -1
iNumTotalPaquets = 0 iNumPaquetActual = 0 sArxNom = ""
End If
'Modificar el procés
End Select
End Select
End Select
Proc_OK:
'S'ha connectat al servidor correctament, esperant enviar el paquet
' d'idenfificació...
IntentConnexio = ICConnectat Proc_MsgServer:
sServMiss(0) = Paquet(1) sServMiss(1) = Paquet(2) 'Sortir del procediment Exit Sub
Final_Error:
'S'ha produït un error en el procediment: anul·lar i sortir IntentConnexio = ICError
End Sub
Private Sub WinSock_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'Ensenya el missatge d'error
If IntentConnexio <> ICEsperant Then Alert "Error de connexió", Description & vbCrLf & "[ERR NUM: " & Number & "]", IError, vbModal 'Posar la variable de l'estat de l'intent de conenxió a ERROR
IntentConnexio = ICError 'Me.desconnectar
End Sub
Tipus: Mòdul de classe Nom: clsINIRutines Autor: Steve McMahon Modificació: Víctor Ariño
Private m_sRuta As String Private m_sKey As String Private m_sSeccio As String Private m_sDefault As String Private m_lCodiRetornat As Long
Private Declare Function WritePrivateProfileString Lib "kernel32"
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias
"GetPrivateProfileStringA" (ByVal lpApplicationName As Any, ByVal lpKeyName As Any, ByVal lpDefault As Any, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Property Let Default(sDefault As String)
m_sDefault = sDefault End Property
Property Get Default() As String Default = m_sDefault
End Property
Property Let Ruta(sRuta As String) m_sRuta = sRuta
End Property
Property Get Ruta() As String Ruta = m_sRuta
End Property
Property Let Key(sKey As String) m_sKey = sKey
End Property
Property Get Key() As String Key = m_sKey
End Property
Property Let Seccio(sSeccio As String) m_sSeccio = sSeccio
End Property
Property Get Seccio() As String Seccio = m_sSeccio
End Property
Property Get Value() As String
Dim sBuf As String 'Cadena del Bufer
Dim iSize As String 'Longitud del bufer Dim iRetCode As Integer 'Codi de retorn
sBuf = Space$(255) 'Bufer de 255 (byte-null) iSize = Len(sBuf) 'Longitud del bufer
iRetCode = GetPrivateProfileString(m_sSeccio, m_sKey, m_sDefault, sBuf, iSize, m_sRuta)
If (iSize > 0) Then
Value = Left$(sBuf, iRetCode) Else
Value = ""
End If End Property
Property Let Value(sValue As String) Dim iPos As Integer
'Buscar el caràcter null iPos = InStr(sValue, Chr$(0))
'Mentre el caràcter null no sigui el primer ("") Do While iPos <> 0
sValue = Left$(sValue, (iPos - 1)) & Mid$(sValue, (iPos + 1)) iPos = InStr(sValue, Chr$(0))
Loop
m_lCodiRetornat = WritePrivateProfileString(m_sSeccio, m_sKey, sValue, m_sRuta)
End Property
Public Sub DeleteKey()
m_lCodiRetornat = WritePrivateProfileString(m_sSeccio, m_sKey, 0&, m_sRuta)
End Sub
Public Sub DeleteSeccio()
m_lCodiRetornat = WritePrivateProfileString(m_sSeccio, 0&, 0&, m_sRuta)
End Sub
Property Get INISeccio() As String Dim sBuf As String
Dim iSize As String Dim iRetCode As Integer sBuf = Space$(8192) iSize = Len(sBuf)
iRetCode = GetPrivateProfileString(m_sSeccio, 0&, m_sDefault, sBuf, iSize, m_sRuta)
If (iSize > 0) Then
INISeccio = Left$(sBuf, iRetCode) Else
INISeccio = ""
End If End Property
Property Let INISeccio(sSeccio As String)
m_lCodiRetornat = WritePrivateProfileString(m_sSeccio, 0&, sSeccio, m_sRuta)
End Property
Property Get Seccions() As String Dim sBuf As String
Dim iSize As String Dim iRetCode As Integer sBuf = Space$(8192) iSize = Len(sBuf)
iRetCode = GetPrivateProfileString(0&, 0&, m_sDefault, sBuf, iSize, m_sRuta)
If (iSize > 0) Then
Seccions = Left$(sBuf, iRetCode) Else
Seccions = ""
End If End Property
Public Sub DesaPosicio(ByRef frmThis As Object, Optional ByVal DesarTamany As Boolean = False)
On Error GoTo CarrError Dim UltimaSeccio As String
'Desar la última secció per no alterar el funcionament UltimaSeccio = Seccio
'Posar secció = al nom del form sense "frm"
Seccio = Right(frmThis.Name, Len(frmThis.Name) - 3)
'Carregar la posició
Valor "PosX", IIf(Not (frmThis.Left < 0 And frmThis.Left >
Screen.Width), frmThis.Left, 0)
Valor "PosY", IIf(Not (frmThis.Top < 0 And frmThis.Top >
Screen.Height), frmThis.Top, 0)
'Carregar el tamany del formulari If DesarTamany = True Then
If frmThis.WindowState = vbMaximized Then Valor "Max", "1"
Else
Valor "Max", "0"
Valor "SizeX", frmThis.Width Valor "SizeY", frmThis.Height End If
End If
Seccio = UltimaSeccio
CarrError:
End Sub
Public Sub CarregaPosicio(ByRef frmThis As Object, Optional ByVal CarregarTamany As Boolean = False)
On Error GoTo CarrError Dim UltimaSeccio As String
'Desar la última secció per no alterar el funcionament UltimaSeccio = Seccio
'Posar secció = al nom del form sense "frm"
Seccio = Right(frmThis.Name, Len(frmThis.Name) - 3)
'Carregar la posició
frmThis.Left = Valor("PosX") frmThis.Top = Valor("PosY")
If frmThis.Left < 0 Or frmThis.Left > Screen.Width < 0 Then frmThis.Left = 0
If frmThis.Top < 0 Or frmThis.Top > Screen.Height < 0 Then frmThis.Top = 0
'Carregar el tamany del formulari If CarregarTamany = True Then
If Valor("Max") = "1" Then frmThis.WindowState = vbMaximized
If Valor("SizeX") < Screen.Height Then frmThis.Width = Valor("SizeX")
If Valor("SizeY") < Screen.Width Then frmThis.Height = Valor("SizeY")
End If
Seccio = UltimaSeccio CarrError:
End Sub
Public Function Valor(vClau As String, Optional vValor As String = "", Optional vSeccio As String = "") As String
On Error GoTo ProcErr
Dim vSeccioAnterior As String vSeccioAnterior = Me.Seccio 'si no s'ha definit una seccio
If Trim(vSeccio) <> "" Then Me.Seccio = vSeccio 'retornar valor = no s'ha assignat un valor If Trim(vValor) = "" Then
m_sKey = vClau Valor = Me.Value
Else ' s'ha assignat un valor, posar-lo m_sKey = vClau
Me.Value = vValor End If
Me.Seccio = vSeccioAnterior Exit Function
ProcErr:
Valor = "0"
End Function
Tipus: Mòdul de classe Nom: clsMemoria Autor: Víctor Ariño 'Tipus dels Resums
'' Nom d'Usuari que ha fet l'accio (12) ' ID del Resum
' Numero de Revisió a la que es va aplicar ' Acció: Aprovat
' Acció: Puntuat '
Private Type Memoria
sUsuari As String * 12 iResumID As Integer iRevisio As Integer bAprovat As Boolean bPuntuat As Boolean bDescarregat As Boolean End Type
Public Enum eModMemoria MM_OK = 0
MM_JaDescarregat = 1 MM_JaAprovat = 2 MM_JaPuntuat = 3 MM_NoDescarregat = 4
MM_RevisioNoDescarregada = 5 MM_No = 6
End Enum
'Variable amb la memoria Private aMemoria() As Memoria 'Número d'arxiu
Private Const ArxMemo As Byte = 8
Private Const ArxMemoName As String = "\acces.dll"
Public Function ModMemoria(resID As Integer, Revisio As Integer, Optional Descarregat As Boolean = False, _
Optional Aprovat As Boolean = False, Optional Votat As Boolean = False, _
Optional JustQuestion As Boolean = False) As eModMemoria
Dim iTmp As Integer
For iTmp = 0 To UBound(aMemoria)
If aMemoria(iTmp).sUsuari = sNomUsuari And aMemoria(iTmp).iResumID = resID Then
'Comprovar la revisió de l'arxiu 'Mateixa revisió
If aMemoria(iTmp).iRevisio = Revisio Then
If aMemoria(iTmp).bDescarregat = True Then
'L'arxiu ja ha estat descarregat...
' no cal fer res perquè ja retorna FALSE igualment '
'If Descarregat = True Then ModMemoria = False
'Si es demana per aprobar If Aprovat = True Then
If aMemoria(iTmp).bAprovat = False Then 'Es pot fer la modificació
ModMemoria = MM_OK
'Si només és una pregunta: sortir
If JustQuestion = True Then Exit Function 'Si no ho és: aprovar
aMemoria(iTmp).bAprovat = True Else
'Ja ha estat aprovat ModMemoria = MM_JaAprovat 'Sortir
Exit Function End If
End If
'Si es demana per votar If Votat = True Then
If aMemoria(iTmp).bPuntuat = False Then 'Es pot fer la modificació
ModMemoria = MM_OK
'Si només és una pregunta: sortir
If JustQuestion = True Then Exit Function 'Si no ho és: puntuar
aMemoria(iTmp).bPuntuat = True Else
'Ja ha estat aprovat ModMemoria = MM_JaPuntuat 'Sortir
Exit Function End If
End If
Else
'Si l'arxiu no ha estat descarregat retorna false a tot
' excepte si es demana per descarregar
If Descarregat = True Then 'Es pot fer la modificació ModMemoria = MM_OK
'Si només és una pregunta: sortir
If JustQuestion = True Then Exit Function 'Si no ho és: descarregar
aMemoria(iTmp).bDescarregat = True Else
'Si no s'ha demanat per descarregar ModMemoria = MM_NoDescarregat
'Sortir
Exit Function End If
End If
Else
'Si la revisió és diferent... no s'ha descarregat ' només cal actuar en el cas que s'hagi descarregat If Descarregat = True Then
'Es pot fer la modificació ModMemoria = MM_OK
'Si només és una pregunta: sortir
If JustQuestion = True Then Exit Function 'Si no ho és: modificar valors
aMemoria(iTmp).bDescarregat = True aMemoria(iTmp).bAprovat = False aMemoria(iTmp).bPuntuat = False aMemoria(iTmp).iRevisio = Revisio Else
'En qualsevol altre cas, la revisió no ha estat descarregada
ModMemoria = MM_RevisioNoDescarregada 'Sortir
Exit Function
End If
End If
'Final de l'IF ja s'ha trobat coincidència llavors es pot sortir i escriure
GoTo Escriure
End If
Next iTmp
'Depurar el registre del primer error...
If iTmp = 1 And IsEmpty(aMemoria(0).iResumID) = True Then iTmp = 0
'Si surt per aquí del búcle és perquè no s'ha trobat cap coincidència d'usuari i ID
' crear un nou registre
'En tots els casos l'arixu no ha estat descarregat excepte si es demana aquesta acció
ModMemoria = MM_NoDescarregat If Descarregat Then
ModMemoria = MM_OK End If
If JustQuestion = True Then Exit Function
ReDim Preserve aMemoria(0 To iTmp) aMemoria(iTmp).bAprovat = False
aMemoria(iTmp).bDescarregat = Descarregat aMemoria(iTmp).bPuntuat = False
aMemoria(iTmp).iResumID = resID aMemoria(iTmp).iRevisio = Revisio aMemoria(iTmp).sUsuari = sNomUsuari
Escriure:
If JustQuestion = True Then Exit Function 'Desar-ho al disc
Put #ArxMemo, (iTmp + 1), aMemoria(iTmp) End Function
Private Sub CarregarInfo()
On Error Resume Next Dim iTmp As Integer
'Depuració de si no hi ha cap usuari If LOF(ArxMemo) = 0 Then
ReDim aMemoria(0) Exit Sub
End If
'Carregar la info dels usuaris Do While Not EOF(ArxMemo) 'Augmentar la matriu
ReDim Preserve aMemoria(iTmp) 'Obtenir les dades
Get #ArxMemo, (iTmp + 1), aMemoria(iTmp) 'Augmentar el comptador
Sumar iTmp, 1 Loop
End Sub
Private Sub Class_Initialize() 'Obrir el arxiu x access
Open App.path & ArxMemoName For Random Access Read Write Lock Read Write As #ArxMemo
'Carregar la informació CarregarInfo
End Sub
Private Sub Class_Terminate() 'Tancar l'arxiu d'usuaris Close #ArxMemo
End Sub
Tipus: Mòdul de classe Nom: clsINIRutines
Autor: Aleksandar Ruzicic a.k.a. Krckoorascic Modificació: Víctor Ariño
'----[ API's ]----'
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias
"RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private 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
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias
"RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias
"RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias
"RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias
"RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Private Declare Function RegQueryValueEx 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
Private Declare Function RegQueryValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByRef lpData As Long, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegSetValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Long, ByVal cbData As Long) As Long Private Declare Function RegSetValueExB Lib "advapi32.dll" Alias
"RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Byte, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias
"RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
'----[ Constants ]----'
Private Const ERROR_SUCCESS = 0&
Private Const ERROR_BADDB = 1009&
Private Const ERROR_BADKEY = 1010&
Private Const ERROR_CANTOPEN = 1011&
Private Const ERROR_CANTREAD = 1012&
Private Const ERROR_CANTWRITE = 1013&
Private Const ERROR_OUTOFMEMORY = 14&
Private Const ERROR_INVALID_PARAMETER = 87&
Private Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const ERROR_MORE_DATA = 234&
Private Const KEY_QUERY_VALUE = &H1&
Private Const KEY_SET_VALUE = &H2&
Private Const KEY_CREATE_SUB_KEY = &H4&
Private Const KEY_ENUMERATE_SUB_KEYS = &H8&
Private Const KEY_NOTIFY = &H10&
Private Const KEY_CREATE_LINK = &H20&
Private Const READ_CONTROL = &H20000 Private Const WRITE_DAC = &H40000 Private Const WRITE_OWNER = &H80000 Private Const SYNCHRONIZE = &H100000
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 Private Const STANDARD_RIGHTS_READ = READ_CONTROL Private Const STANDARD_RIGHTS_WRITE = READ_CONTROL Private Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Private Const KEY_WRITE = STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY
Private Const KEY_EXECUTE = KEY_READ
Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
'----[ Enums ]----'
Public Enum rcMainKey 'root keys constants HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001 HKEY_LOCAL_MACHINE = &H80000002 HKEY_USERS = &H80000003
HKEY_PERFORMANCE_DATA = &H80000004 HKEY_CURRENT_CONFIG = &H80000005 HKEY_DYN_DATA = &H80000006
End Enum
Public Enum rcRegType 'data types constants REG_NONE = 0
REG_SZ = 1
REG_EXPAND_SZ = 2 REG_BINARY = 3 REG_DWORD = 4
REG_DWORD_LITTLE_ENDIAN = 4 REG_DWORD_BIG_ENDIAN = 5 REG_LINK = 6
REG_MULTI_SZ = 7 REG_RESOURCE_LIST = 8
REG_FULL_RESOURCE_DESCRIPTOR = 9 REG_RESOURCE_REQUIREMENTS_LIST = 10
End Enum
'----[ Dim's ]----'
Private hKey As Long Private mainKey As Long Private sKey As String Private lBufferSize As Long Private lDataSize As Long Private ByteArray() As Byte Private createNoExists As Boolean '----[ CreateKeyIfDoesntExists ]----'
Public Property Let CreateKeyIfDoesntExists(ByVal offon As Boolean) createNoExists = offon
End Property
Public Property Get CreateKeyIfDoesntExists() As Boolean CreateKeyIfDoesntExists = createNoExists
End Property
'----[ CreateKey ]----'
Public Function CreateKey(ByVal sPath As String) As Long
hKey = GetKeys(sPath, sKey) 'get keys
'try to create key
If (RegCreateKey(hKey, sKey, mainKey) = ERROR_SUCCESS) Then RegCloseKey mainKey
CreateKey = mainKey 'success Else
CreateKey = 0 'error End If
End Function
'----[ KillKey ]----'
Public Function KillKey(ByVal sPath As String) As Long hKey = GetKeys(sPath, sKey)
'try to delete key
If (RegOpenKeyEx(hKey, sKey, 0, KEY_ALL_ACCESS, mainKey) = ERROR_SUCCESS) Then
RegDeleteKey mainKey, "" 'delete key RegCloseKey mainKey
KillKey = mainKey 'success Else
KillKey = 0 'error End If
End Function
'----[ WriteString ]----'
Public Function WriteString(ByVal sPath As String, ByVal sName As String, _
ByVal sValue As String) As Long
If (KeyExists(sPath) = False) Then 'if key don't exists, If (createNoExists = True) Then 'and if
CreateKeyIfDoesntExists = True
CreateKey sPath ' then create it ;o) Else
WriteString = 0 'error!
Exit Function End If
End If
hKey = GetKeys(sPath, sKey) 'parse keys If (sName = "@") Then sName = "" '(Default)
'try to open key
If (RegOpenKeyEx(hKey, sKey, 0, KEY_WRITE, mainKey) = ERROR_SUCCESS) Then
'try to write data
If (RegSetValueEx(mainKey, sName, 0, REG_SZ, ByVal sValue, Len(sValue)) = ERROR_SUCCESS) Then
RegCloseKey mainKey 'close key WriteString = mainKey 'success!
Else
WriteString = 0 'error writting data End If
Else
WriteString = 0 'error opening key End If
End Function
'----[ ReadString ]----'
Public Function ReadString(ByVal sPath As String, ByVal sName As String, _
Optional sDefault As String = vbNullChar) As String
Dim sData As String, lDuz As Long
hKey = GetKeys(sPath, sKey) 'try to open key
If (RegOpenKeyEx(hKey, sKey, 0, KEY_READ, mainKey) = ERROR_SUCCESS) Then
sData = Space(255) 'make buffer
lDuz = Len(sData) 'get buffer size (255) 'try to query data
If (RegQueryValueEx(mainKey, sName, 0, REG_SZ, sData, lDuz) = ERROR_SUCCESS) Then
RegCloseKey mainKey 'close key sData = Trim$(sData) 'trims string
ReadString = Left$(sData, Len(sData) - 1) 'returning readed value
Else
ReadString = sDefault 'return default value (error) End If
Else
ReadString = sDefault 'return default value (error) End If