I have written the following code to receive SMS messages from a phone using the
Telephony APIs, and it all appears to work except for one step: TelSmsSelectStorage
never changes the storage from store 0 (the SIM card). No matter what I do it never
changes. I have written the code synchoronously (as seen here), asynchronously, trying
different values for the storage, still nothing.
The Palm France team, who wrote the Telephony APIs, haven't been able to help me out
with this so I am really hoping that someone here will know something about what I
need to do to retrieve messages from all available stores.
Any help would be greatly appreciated.
Thanks,
trv
PS: I stripped out all the code pertaining to my app specifically, like the storing of
the messages in my database, etc.
#define errIambicMailMemAllocFail (appErrorClass | 0x01)
Err SMS_RetrieveMessages (void)
{
Err err;
TelSmsGetMessageCountType messageCount;
TelSmsReadMessagesType readMessages;
TelSmsGetAvailableStorageType getAvailStore;
UInt16 dataMaxSize, j, i, count = 8, msgCount;
getAvailStore.count = count; // get the first 8 stores
getAvailStore.storagesP = MemPtrNew (8 * sizeof (UInt8));
if (getAvailStore.storagesP)
{
err = TelSmsGetAvailableStorage (smsLibRef, smsPalmTelAppID, &getAvailStore, NULL);
if (err == errNone || err == telErrBufferSize) // not fitting is OK
{
count = (getAvailStore.count > 8 ? 8 : getAvailStore.count);
for (j = 0; j < count ; j++)
{
err = TelSmsSelectStorage (smsLibRef, smsPalmTelAppID,
getAvailStore.storagesP[j], NULL); // this function call doesn't seem to properly
sellect the storage!
if (err == errNone)
{
messageCount.messageType = kTelSmsMessageTypeDelivered;
err = TelSmsGetMessageCount (smsLibRef, smsPalmTelAppID, &messageCount, NULL);
if (err == errNone)
{
err = TelSmsGetDataMaxSize (smsLibRef, smsPalmTelAppID, &dataMaxSize, NULL);
if (err == errNone)
{
readMessages.first = 0;
readMessages.count = messageCount.count;
readMessages.messagesP = MemPtrNew ((readMessages.count + 1) * sizeof
(TelSmsDeliveryMessageType));
if (readMessages.messagesP)
{
for (i = 0; i < readMessages.count; i++)
{
readMessages.messagesP[i].version = kTelSmsAPIVersion;
readMessages.messagesP[i].index = 0;
readMessages.messagesP[i].dataSize = dataMaxSize;
readMessages.messagesP[i].data = MemPtrNew ((dataMaxSize + 1) * sizeof
(UInt8));
if (! readMessages.messagesP[i].data)
{
err = errIambicMailMemAllocFail;
break;
}
readMessages.messagesP[i].originatingAddressSize =
kTelMaxPhoneNumberLen + 1;
readMessages.messagesP[i].originatingAddress = MemPtrNew
((kTelMaxPhoneNumberLen + 1) * sizeof (Char));
if (! readMessages.messagesP[i].originatingAddress)
{
err = errIambicMailMemAllocFail;
break;
}
readMessages.messagesP[i].advancedParams.advancedGSM.serviceCenterNumber = MemPtrNew
((kTelMaxPhoneNumberLen + 1) * sizeof (Char));
if (!
readMessages.messagesP[i].advancedParams.advancedGSM.serviceCenterNumber)
{
err = errIambicMailMemAllocFail;
break;
}
readMessages.messagesP[i].advancedParams.advancedGSM.serviceCenterNumberSize =
kTelMaxPhoneNumberLen + 1;
readMessages.messagesP[i].extensionsCount = 5; // Palm OS Ref pg. 1797
says to allocate between 3 and 5 extensions for a message
readMessages.messagesP[i].extensionsP = MemPtrNew (5 * sizeof
(TelSmsExtensionType));
if (! readMessages.messagesP[i].extensionsP)
{
err = errIambicMailMemAllocFail;
break;
}
}
err = TelSmsReadMessages (smsLibRef, smsPalmTelAppID, &readMessages,
NULL);
if (! err || err == telErrBufferSize) // not fitting into buffers is OK
{
for (i = 0; i < readMessages.count; i++)
{
// Store the received message i
// Free the memory allocated by received message i
}
}
MemPtrFree (readMessages.messagesP);
}
else
err = errIambicMailMemAllocFail;
}
}
}
}
}
MemPtrFree (getAvailStore.storagesP);
}
else
err = errIambicMailMemAllocFail;
return (err);
}
--
Trevor Lalish-Menagh, Software Engineer
iambic, Inc. (www.iambic.com)
[EMAIL PROTECTED]
(408) 367-1600 x20
--
For information on using the Palm Developer Forums, or to unsubscribe, please see
http://www.palmos.com/dev/support/forums/