MODULE1.BAS

Attribute VB_Name = "Module1" 
'****************************************************************************
'
' Module: VBCARD.EXE
' File: Module1.frm
' Content: Implementation of the VbCard processes
'
' Copyright (c) Microsoft Corporation 1995-1997
'
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
' ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
' THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
' PARTICULAR PURPOSE.
'****************************************************************************

Option Explicit

Public Const BIZCARD_DATA_SIZE As Integer = 568
Const SIZE_OFFSET As Integer = 0
Const NAME_OFFSET As Integer = 4
Const TITLE_OFFSET As Integer = 84
Const COMPANY_OFFSET As Integer = 164
Const ADDRESS_OFFSET As Integer = 244
Const PHONE_OFFSET As Integer = 324
Const FAX_OFFSET As Integer = 404
Const EMAIL_OFFSET As Integer = 484
Const IMAGESIZE_OFFSET As Integer = 564
Const STRING_LENGTH As Integer = 80

' Beta2 NetMeeting breaks up data transfers into 4K packets
Const MAX_DATA_PACKET As Integer = 4096

' of course this is a bad thing
Const PictureDir As String = "c:\"

Private Type LongBytes
b0 As Byte
b1 As Byte
b2 As Byte
b3 As Byte
End Type

Private Type LongType
l As Long
End Type

Public Type BizCardInfo
Name As String
Title As String
Company As String
Address As String
Phone As String
Fax As String
EMail As String
PhotoFile As String
End Type

Public Type MemberInfo
Name As String
Card As BizCardInfo
Photo As Picture
ImageSize As Long
FileOpen As Boolean
End Type

Public MyCard As BizCardInfo
Public ActiveCard As BizCardInfo
Public MemberInfoArray(15) As MemberInfo
Public ActiveIndex As Integer

Public Sub ReadBizCard( _
App As String, _
Name As String, _
Card As BizCardInfo)

Card.Name = GetSetting(App, Name, "Name", "")
Card.Title = GetSetting(App, Name, "Title", "")
Card.Company = GetSetting(App, Name, "Company", "")
Card.Address = GetSetting(App, Name, "Address", "")
Card.Phone = GetSetting(App, Name, "Phone", "")
Card.Fax = GetSetting(App, Name, "Fax", "")
Card.EMail = GetSetting(App, Name, "EMail", "")
Card.PhotoFile = GetSetting(App, Name, "Photo", "")
End Sub

Public Sub WriteBizCard( _
App As String, _
Name As String, _
Card As BizCardInfo)

SaveSetting App, Name, "Name", Card.Name
SaveSetting App, Name, "Title", Card.Title
SaveSetting App, Name, "Company", Card.Company
SaveSetting App, Name, "Address", Card.Address
SaveSetting App, Name, "Phone", Card.Phone
SaveSetting App, Name, "Fax", Card.Fax
SaveSetting App, Name, "EMail", Card.EMail
SaveSetting App, Name, "Photo", Card.PhotoFile
End Sub

Private Sub UpdateActivePhoto()
VbCard.Photo.Picture = MemberInfoArray(ActiveIndex).Photo
End Sub

Public Sub UpdateActiveIndex(Name As String)
ActiveIndex = GetMemberIndex(Name)
If ActiveIndex < 0 Then
ActiveIndex = 0
End If

UpdateActivePhoto
End Sub

Public Function GetActiveCard() As BizCardInfo
If ActiveIndex >= 0 Then
GetActiveCard = MemberInfoArray(ActiveIndex).Card
End If
End Function

Private Sub InitMember(Index As Integer)
MemberInfoArray(Index).Name = ""
MemberInfoArray(Index).FileOpen = False
Set MemberInfoArray(Index).Photo = VbCard.Unknown.Picture
End Sub

Public Sub InitMemberArray()
Dim Index As Integer

For Index = 0 To 15
InitMember Index
Next
End Sub

Public Function GetMemberIndex(Name As String) As Integer
Dim Index As Integer

GetMemberIndex = -1
For Index = 0 To 15
If MemberInfoArray(Index).Name = Name Then
GetMemberIndex = Index
Exit For
End If
Next
End Function

Public Sub DeleteMember(Member As IConfMemberX)
Dim Index As Integer

Index = GetMemberIndex(Member.Name)
If Index >= 0 Then
InitMember Index
End If
End Sub

Public Sub AddMember(Member As IConfMemberX)
Dim Index As Integer

Index = GetMemberIndex(Member.Name)
If Index >= 0 Then
' already a member
Exit Sub
End If

' find next empty slot
Index = GetMemberIndex("")
If Index >= 0 Then
MemberInfoArray(Index).Name = Member.Name

' If adding self, need to load user's picture
If Member.IsSelf Then
Dim MyPict As Picture

MemberInfoArray(Index).Card = MyCard
On Error Resume Next
Set MyPict = LoadPicture(MyCard.PhotoFile)
If Not Err Then
Set MemberInfoArray(Index).Photo = MyPict
End If
End If
End If
End Sub

Public Sub ReceiveImage(Name As String, DataTransfer As IConfDataTransferX)
Dim Size As Integer
Dim Index As Integer
Dim FileNumber As Integer

' Create the member's picture from the transferred data
' Allows for Beta2 NetMeeting 4K packet breakup

Index = GetMemberIndex(Name)
FileNumber = Index + 1

' Make sure that the temporary file is open
If Not MemberInfoArray(Index).FileOpen Then
On Error Resume Next
MemberInfoArray(Index).Card.PhotoFile = PictureDir & Name & ".bmp"
Open MemberInfoArray(Index).Card.PhotoFile For Binary As #FileNumber
If Err Then
Exit Sub
End If
MemberInfoArray(Index).FileOpen = True
End If

Size = DataTransfer.BytesTransferred
ReDim buf(1 To Size) As Byte
buf = DataTransfer.Array(1)
Put #FileNumber, , buf

' Assumes complete if the packet is not 4K
' This will cause problems if the picture is an exact multiple of 4K
If Size <> MAX_DATA_PACKET Then
'Close the file
Close #FileNumber
MemberInfoArray(Index).FileOpen = False

' Load the picture
Set MemberInfoArray(Index).Photo = _
LoadPicture(MemberInfoArray(Index).Card.PhotoFile)

' Delete the file
Kill MemberInfoArray(Index).Card.PhotoFile

' If this is the current member, update the picture
If Index = ActiveIndex Then
UpdateActivePhoto
End If
End If
End Sub

Private Function getVbString( _
Buffer() As Byte, _
first As Integer, _
length As Integer)

' Convert a fixed length array of Bytes into a VB string
' (each Byte is an 8 bit ASCII character)

Dim i As Integer
Dim j As Integer
ReDim szText(1 To length) As Byte

j = first
For i = 1 To length
szText(i) = Buffer(j)
j = j + 1
Next
getVbString = StrConv(szText, vbUnicode)
End Function

Public Sub ReceiveBizCard( _
Name As String, _
DataTransfer As IConfDataTransferX)

' Copy transfered data into the member's BizCardInfo structure

Dim Index

Index = GetMemberIndex(Name)
If Index >= 0 Then
Dim Data() As Byte
Data = DataTransfer.Array(1)

MemberInfoArray(Index).Card.Name = getVbString(Data, _
NAME_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.Title = getVbString(Data, _
TITLE_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.Company = getVbString(Data, _
COMPANY_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.Address = getVbString(Data, _
ADDRESS_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.Phone = getVbString(Data, _
PHONE_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.Fax = getVbString(Data, _
FAX_OFFSET, STRING_LENGTH)
MemberInfoArray(Index).Card.EMail = getVbString(Data, _
EMAIL_OFFSET, STRING_LENGTH)
End If

End Sub

Private Sub setVbString( _
strText As String, _
Buffer() As Byte, _
first As Integer, _
length As Integer)

' Convert a VB String into an fixed length array of Bytes
' (each Byte is an 8 bit ASCII character)

Dim i As Integer
Dim j As Integer
Dim szText() As Byte

szText = StrConv(strText, vbFromUnicode)

' just in case szText is ""
Buffer(first) = 0

j = first
For i = LBound(szText) To UBound(szText)
Buffer(j) = szText(i)
j = j + 1
Next
End Sub

Public Sub BizCardToBytes(ByRef Card As BizCardInfo, _
Buffer() As Byte, _
Size As Integer)

' Convert a BizCardInfo structure into an array of Bytes

Dim bSize As LongBytes
Dim lSize As LongType
ReDim Buffer(BIZCARD_DATA_SIZE - 1) As Byte

lSize.l = BIZCARD_DATA_SIZE
LSet bSize = lSize

Buffer(SIZE_OFFSET) = bSize.b0
Buffer(SIZE_OFFSET + 1) = bSize.b1
Buffer(SIZE_OFFSET + 2) = bSize.b2
Buffer(SIZE_OFFSET + 3) = bSize.b3

lSize.l = Size
LSet bSize = lSize

Buffer(IMAGESIZE_OFFSET) = bSize.b0
Buffer(IMAGESIZE_OFFSET + 1) = bSize.b1
Buffer(IMAGESIZE_OFFSET + 2) = bSize.b2
Buffer(IMAGESIZE_OFFSET + 3) = bSize.b3

setVbString Card.Name, Buffer, _
NAME_OFFSET, STRING_LENGTH
setVbString Card.Title, Buffer, _
TITLE_OFFSET, STRING_LENGTH
setVbString Card.Company, Buffer, _
COMPANY_OFFSET, STRING_LENGTH
setVbString Card.Address, Buffer, _
ADDRESS_OFFSET, STRING_LENGTH
setVbString Card.Phone, Buffer, _
PHONE_OFFSET, STRING_LENGTH
setVbString Card.Fax, Buffer, _
FAX_OFFSET, STRING_LENGTH
setVbString Card.EMail, Buffer, _
EMAIL_OFFSET, STRING_LENGTH
End Sub

Public Function PictureToBytes( _
FileName As String, _
Buffer() As Byte) As Integer
Dim FileNumber As Integer

' Convert a bitmap file into an array of Bytes

FileNumber = 99
On Error Resume Next
Open FileName For Binary As #FileNumber
If Err Then
' check for empty file name here
If FileName = "" Then
MsgBox "Picture file name is empty"
Else
MsgBox "Unable to open " & FileName
End If
PictureToBytes = 0
Else
Dim Size As Integer

Size = LOF(FileNumber)
ReDim Buffer(1 To Size) As Byte
Get #FileNumber, , Buffer()
Close #FileNumber
PictureToBytes = Size
End If
End Function