• No se han encontrado resultados

SUITE ESTUDIANT

N/A
N/A
Protected

Academic year: 2023

Share "SUITE ESTUDIANT"

Copied!
172
0
0

Texto completo

(1)

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)

(2)

Índex

1 El client 2

2 El servidor 112

(3)

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

(4)

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

(5)

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)

(6)

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

(7)

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

(8)

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)

(9)

'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

(10)

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")

(11)

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")

(12)

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

(13)

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

(14)

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

(15)

'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"

(16)

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

(17)

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

(18)

'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

(19)

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

(20)

'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

(21)

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

(22)

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

(23)

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

(24)

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..."

(25)

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)

(26)

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....

(27)

'[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

(28)

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ó

(29)

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

(30)

'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

(31)

'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

(32)

IntentConnexio = ICError 'Me.desconnectar

End Sub

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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&

(42)

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

(43)

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

(44)

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

Referencias

Documento similar

threat to its utility but is actually indicative of the fact that it is causation we are dealing with, rather than something else. You strike a match and it lights. It is

Por ello, y habida cuenta que la reserva puede implicar la suspensión, modificación o re- vocación de un acto de apertura de la cosa al uso público y, en todo caso, la denegación

Ahora tienes unos segundos para leer las preguntas!. (Pause 10

The creation of narratives does not imply the existence of an audience apart from oneself; as it has been said, the main goal of narrative is to confer sense on the different

Patients with true LFLG AS also had a significantly higher long-term mortality than those with paradoxical LFLG AS (27 vs. CONCLUSIONS: AVR in patients with LFLG AS is associated

rírse al interés que la Unión Soviética lia despertado en todos los sectores de la opinión británica desde que lucha con- tra Alemania, el autor contesta a la pri- mera

El primer objetivo de esta tesis consiste en el estudio de las posibilidades de un algoritmo r´apido de b´ usqueda del vecino m´as cercano, el LAESA, para obtener una disminuci´on en

(i) One obtains field equations which are equivalent to those of unimodular gravity and general relativity as the only consistent results of the self-coupling of gravitons as long