RecordMessage Make a button proc (?) that gets called when Record is clicked. It should do like FinchSmarts.RecordMessage: set up a conversation with the recording service, get an utterance number and encryption key, etc. Build the msg ID from the utterance number and the time, and put it into a viewer someplace. If there isn't already an attachment field, build one, using WalnutSendOps.BuildSendViewer procedure. Get from Bluejay an index into the utterance array, and set default expiration date to some small time in the future. StopRecordingMessage Should be like FinchSmarts.StopMessage, and keep local copy of number of samples, etc. AttachMessage (use to attach newly-recorded message or existing message) Fill in the ID of the voice message, using a WalnutSendOps procedure to fill in the field if it exists, or create and fill in the field if not. Tell Bluejay that this utterance is now in use. (A message that is recorded but not attached to anything should be garbage collected. It will now have a tuple in the database, and will not have its bit set on in the Bluejay array; hmmm, how does the GC know it's time to collect such a BJ utterance? Because default expiration date has expired and its in-use bit is off.) DeleteVoice, -- request to lose voice attached to a received message If message is in an interesting message set, write a log entry to decrement the ICC in its ReceivedList tuple. If message is in an uninteresting msg set, do nothing (really? suppose the voice gets deleted when the message is in Active, and then gets moved to an interesting message set. Don't want to re-increment the reference count.) OK, remove it from the ReceivedList relation entirely. If the ICC is >1 at the time, then there is some other copy of this message in an interesting message set, from which the voice is also being deleted. So be it. A nuthatch log transaction, not embedded in any others. SendMessage (or StoreMessage) Tell Bluejay that this utterance is now in use? Notify Bluejay to update the default expiration time of the utterance in this voice file. (If the user doesn't get around to restoring and sending this within the expiration period, it will go away and get garbage collected just like unread voice messages.) If this ID is new to VoiceReferences, add (voiceMessageID, referenceCount:0, encryptionKey, samples, type); otherwise add the new information to the existing tuple. A nuthatch log transaction, not embedded in any others. GetMessage, -- from Grapevine, by doing NewMail For each message retrieved, write log entry to add receivedList(recipient, voiceMessageID, grapevineMessageID: GVID, ICC: 0). If it's already there (Walnut bug -- duplicate message), do nothing. All of the log writes are done under the one or two Walnut log transactions (one per mail drop?) in WalnutOps.NewMail. Where is LogEntryType defined? Appears in WalnutStreamImpl.MakeLogEntry. not defined in WalnutStreamImpl. Look in WalnutStream -- used there, too, but not defined. in WalnutLog.mesa Where is MakeLogEntry defined? WalnutStream. 1. Do initialization stuff. Call NuthatchImpl.InitializeLog[logFileName]. Call NuthatchImpl.InitializeDB? 2. At each of the hook points in Walnut, and from my button procs, call Nuthatch routines to write to log. ĘŒ˜JšĎbœ•˜ŁJšœX˜lJšœĹ˜ÓJ˜JšœĽœů˜˛J˜Jš  œ œœ/œ­œ7˜ˇJ˜Jš œë˜÷J˜xJ˜Jšœ<Ďn œţ˜Ć—…—