System and method for performing remote requests with an on-line service network6289390Abstract A remote request system and method monitors and controls the execution of remote requests on an on-line services network. When a remotely located client sends a remote request to the on-line service network, the remote request system monitors the remote request while returning operating control back to the client while the remote request remains pending in the on-line service network. The remote request system also provides for the concurrent execution of multiple pending remote requests, provides status information about each remote request, provides for the cancellation of a pending remote request and optimizes the use of memory. In addition, the remote request system dynamically allocates memory when data blocks of unknown size are transmitted over the on-line services network. Claims What is claimed is: Description BACKGROUND OF THE INVENTION
TABLE 1
TYPE FIELD VALUES DEFINED MEANING
0x01h Byte Parameter Sent From Client To Server
0x02h Word Parameter Sent From Client To Server
0x03h Double Word Parameter Sent From Client To
Server
0x04h Data Blocks Less Than 400 Bytes Sent From
Client To Server
0x05h Data Blocks Greater Than 400 Bytes Sent From
the Client To Server
0x05h Client To Server Cancellation Message
0x81h Byte Parameter Sent From Server To Client
0x82h Word Parameter Sent From Server To Client
0x83h Double Word Parameter Sent From Server To
Client
0x84h Data Block Sent From Server To Client
0x85h Dynamic Data Sent From Server To Client
0x86h End of Dynamic Data Sent From Server To
Client
0x87h Last Parameter Sent From Server To Client
0x89h Server To Client Error Message
Table 1 illustrates the values of the type field 806 in the preferred embodiment. The values of the type field 806 are shown in a hexadecimal format. The type field 806 is a one-byte field which indicates the type of data located in the data field 810. In addition, the type field indicates the destination of the data parameter 804. Thus, the type field can specify that a data parameter is traveling from the client MPC layer 206a to the service MPC layer 206c or vice versa. For example, a type field 806 value of 0.times.01h indicates that a byte parameter is being sent from the client MPC layer 206a to the service MPC layer 206c. In the preferred embodiment, the parameters 804 sent from the client MPC layer 206a to the service MPC layer 206c include four data types: bytes, words, doublewords and data blocks. The parameters 804 sent from the service MPC layer 206c to the client MPC layer 206a include five data types: bytes, words, doublewords, data blocks and dynamic data. The optional length of memory block field 808 only exists in the message 800a when a memory block is sent from the client to the server. Thus, as shown in table 1, when the type field value is set to 0.times.04h, the client is sending a memory block from the client to the server and the value in the length of memory block field 808 indicates the size of the memory block. The length of memory block field 808 indicates the size of the memory block. For example, when the client MPC layer 206a sends a data block to the service MPC layer 206c, the type field 806 is set to 0.times.04h, the length of memory block field 808 contains the size of the data block and the data field 810 contains the transmitted data block. Furthermore, as discussed in more detail below, a type field 806 with the value of 0.times.04h indicates that a data block sent from the client MPC layer 206a to the service MPC layer 206c is less than 400 bytes and accordingly, the length of memory block field 808 contains a value that is less than 400 bytes. When the memory block in a client MPC layer 206a to service MPC layer 206c transfer exceeds 400 bytes, the type filed 806 is set to 0.times.05h and the present invention subdivides the memory block into multiple upload messages 800b. As explained in further detail below, subdividing a large memory block into multiple messages, allows the present invention to cancel a pending remote request before completion of the memory block transfer. The data field 810 is a variable-length field which contains the parameters and data identified in the type field 806. For example, if the client MPC layer 206a sends a double word to the service MPC layer 206c, the type field 806 is loaded with the value 0.times.83h and the data field 810 contains the double word. When the message 800a is received by the MPC layers 206a and 206c, they use the header 802 to identify the remote request and to route the remote request to its proper destination. As is explained in more detail below, the unique message 800a format of the present invention allows the MPC layers 206a and 206c to monitor multiple remote requests, to return control to applications after generating or receiving a remote request, to cancel a pending remote request, to maintain status information, to efficiently use memory, and to support the dynamic allocation of memory. When the client MPC layer 206a sends a memory block parameter greater than 400 bytes, the client MPC layer 206a subdivides the memory block parameter into one message 800a and multiple messages 800b. As shown in FIG. 8B, the first message 800a contains the header 802, a type field 806 set to 0.times.05, an upload parameter identifier 814 and the length of memory block field 808. The upload parameter identifier 814 uniquely identifies all the messages 800b that correspond to the memory block parameter. When a subsequent upload message 800b is sent with additional incremental data, the upload message 800b contains the data shown in FIG. 8C. As illustrated in FIG. 8C, the beginning of each upload message 800b contains an upload field 812 rather than the header 802. In the preferred embodiment, the upload field 812 in the upload message 800b contains the value 0.times.E6h (230) if the upload message 800b is a continuation of an upload message 800b. Furthermore, the last upload message 800b for the particular parameter identified by the upload parameter identifier 812 contains the value 0.times.E7h (231) in the upload field 812. Because the upload field 812 in the upload message 800b is in the same location as the service interface identifier 412 in the messages 800a, the service interface identifiers 412 must have values less than 230 (0.times.E6h). If set to 230, the present invention would mistake a regular message 800a as the upload message 800b. In the preferred embodiment, the service interface identifiers 412 contain the values of 220 or less. In addition, each upload message 800b contains the upload parameter identifier 814 which identifies the memory block parameter being transmitted in the upload message 800b. The upload message 800b also contains the data field 810 which contains the incremental data. a. Generating A Remote Request Referring now to FIG. 9, a block diagram of routines in the MPC layers 206a and 206c are shown. As described in further detail below, when a particular client application 200a generates a remote request, the client application 200a "calls" a routine in the client MPC layer 206a. In the preferred embodiment, the client MPC layer 206a is a library of routines that contain the instructions for sending a remote request to the service MPC layer 206c. Thus, a client application 200a calls a particular routine in the client MPC layer 206a when the name of the routine appears in the program code. The name of the routine is inserted into the program code by a programmer during development of the client application 200a. The names of the routines 900 existing in the client MPC layer 206a that implement the novel features of the present invention include: CreateServiceInstance, CreateMethodInstance, AddParam, RequestDynamicParam, Execute, CancelExecution, WaitIncremental, GetBuffer and FreeMemory. Each of these routines are further discussed below. The names of the routines 902 existing in the service MPC layer 206c that implement the novel features of the present invention include: the ExportInterface, GetRecvParam, SetReturnParam, GetDynamic, AddDynamicData, ServiceDoneWithRequest and BeginSend. Each of these routines are further discussed below. Focusing now on the routines in the client MPC layer 206a, the client applications 200a use the routines in the client MPC layer 206a to generate and monitor pending remote requests. Once a routine in the client MPC layer 206a has sent the request messages 800a or 800b to the service MPC layer 206c, control is passed back to the client application 200a which then continues to execute other program instructions. When the client processor 102 receives a response message 800a associated with a pending remote request, the response message is routed to the service proxy object 404. The service proxy object 404 then obtains the service interface identifier 412 from the message header 802 and routes the response message 800a to the identified interface object 410. The interface object 410 then obtains the method identifier 418 and the method instance identifier 420 from the message header 802 and routes the response message 800a to the identified method object 416. The method object 416 then obtains the parameters 804 from the response message 800a and stores the parameters 804 in the memory locations created for the parameters 804 by the original client application 200a. A static block is not processed incrementally. A dynamic block, in contrast, can be processed incrementally as it is received. When the client MPC layer 206a receives a static block or a dynamic block from the service MPC layer 206c, however, the client MPC layer stores the static blocks and dynamic blocks in a different manner than the other parameters 804. In the preferred embodiment, as discussed in more detail below, the memory to store the static block is not committed until the static block is received from the service MPC layer 206c. In the preferred embodiment, the client application 200a can also direct the client MPC layer 206a to request a dynamic data block. When client MPC layer 206a begins receiving the requested dynamic data block, the client MPC layer 206a instantiates a dynamic object 430. Dynamic data blocks are sent from the service MPC layer 206c to the client MPC layer 206a in incremental segments. As discussed below, the dynamic object 430 receives these incremental segments and stores them in the client computer 102. After routing the parameters 804 to the appropriate memory locations, the client MPC layer 206a updates the status object 426 to signal that an event has occurred. The client application 200a periodically checks for a signaled event and once a signaled event occurs, the client application 200a can begin using the received parameters. Thus, signaling an event in the status object 426 provides the communication mechanism between the client MPC layer 206a and the client application 200a when parameters 804 are received from the service MPC layer 206c. FIG. 10 illustrates a high level flow chart that outlines the routines which a client application 200a calls in order to create, send and check the status of a remote request. Upon activation of a client application 200a in state 1000, that client application 200a continues to execute until the client application 200a needs to send a remote request to the service application 200b. In state 1001, the client application determines whether to submit a remote request to the client MPC layer 206a or check the status of a pending remote request. For example, in state 1001, the client user can direct the client WEATHER application 204a to download a particular weather map, the client WEATHER application 204a then proceeds to state 1002. Alternatively, the client WEATHER application 204a can proceed to state 1003 and check the status of a pending remote request. In state 1003, the client application 200a determines whether it wants to obtain the status of a previously sent remote request. If the client application 200a does desire to check the status of a previously sent request, the client application 202a proceeds to state 1005. While in state 1005, the client application 200a checks the status of a desired request and then returns to state 1000. Returning to state 1003, if the client application 200a does not want to obtain the status of a previously sent remote request, the client application 200a proceeds to state 1007 and determines whether it wants to cancel a previous request. If not, the client application 200a returns to state 1000. However, if the client application 200a does want to cancel a previous request, the client application 200a proceeds to state 1009 and calls the CancelExecution routine. After canceling a previous request with the CancelExecution routine, the client application 200a returns to state 1000. Returning to state 1001, if the client application 202a desires to submit a remote request, the client application 202a proceeds to state 1002. In state 1002, the client application 200a calls the CoCreateInstance routine that initializes the client data structure 208a. To initialize the client data structure 208a, the CoCreateInstance routine instantiates the Main MOS object 400. The instantiated Main MOS object 400 then functions as the root of the client data structure 208a. Proceeding to state 1004, the client application 200a calls a CreateServiceInstance routine that exists in the client MPC layer 206a. The CreateServiceInstance routine opens a communications channel with the desired service application 200b an obtains the exported interface list 408. The CreateServiceInstance routine then instantiates a service proxy object 404, stores the exported interface list 408 in the service proxy object 404 and sets a pointer in the Main MOS object 400 to point to the service proxy object 404. The exported interface list 408 contains the 16-byte OLE interface identifiers for each interface in the service application 200b and a set of one-byte service interface identifiers 412 that correspond to the 16-byte OLE interface identifiers. The present invention uses the exported interface list 408 to convert the 16-byte OLE interface identifiers into their corresponding one-byte service interface identifiers 412. In addition to creating the service proxy object 404, the CreateServiceInstance routine also instantiates the interface object 410, stores the service interface identifier 412 in the interface object 410 and sets a pointer in the service proxy object 404 to point to the interface object 410. When the client application 202a calls the CreateServiceInstance routine, it passes a 16-byte OLE interface identifier which identifies the desired CHAT interface. The CreateServiceInstance routine then looks up the corresponding one-byte service interface identifier 412 in the exported interface list 408. For example, when the client CHAT application 202a calls the CreateServiceInstance routine in state 1004, the CreateServiceInstance routine opens a communications channel with the CHAT service 202b and obtains an exported CHAT interface list 408. The CreateServiceInstance routine then instantiates the CHAT service proxy object 404, stores the exported CHAT interface list 408 in the CHAT service proxy object. The exported interface list 408 contains a 16-byte OLE interface identifier for each interface in the Chat service 202b and the corresponding one-byte service interface identifiers 412 for each interface. The CreateServiceInstance routine also sets a pointer in the Main MOS object 400 to point to the newly instantiated CHAT service proxy object 404. The CreateServiceInstance routine then instantiates the interface object 410 and sets a pointer in the CHAT service proxy object 404 to point to the interface object 410. When the client CHAT application 202a calls the CreateServiceInstance routine, it passes an OLE interface identifier which identifies the desired CHAT interface. The CreateServiceInstance routine looks up the corresponding one-byte service interface identifier 412 existing in the exported interface list 408. After instantiating the service proxy object 404 and the interface object 410, the client application 200a proceeds to state 1006. In state 1006, the client MPC layer 206a instantiates a method object 416 by invoking the CreateMethodInstance routine existing in the client MPC layer 206a. When the client application 200a calls the CreateMethodInstance routine in state 1006, the client application 200a passes the method identifier 418 which identifies the desired remote request. The CreateMethodInstance routine then instantiates a method object 416 and stores the method identifier 418 in the method object 416. For example, when the CHAT client application 200a desires to send the remote request "post comment," the client application 200a calls the CreateMethodInstance routine and passes the method identifier 418 which uniquely identifies the "post comment" request. The CreateMethodInstance routine then instantiates a method object 416 and stores the "post comment" method identifier 418 in the method object 416. After the CreateMethodInstance routine has instantiated the method object 416 in state 1006, the client application 200a proceeds to state 1008. In state 1008, the client application 200a adds client-to-server and server-to-client parameters 424 to the method object 416. The parameters A-might include, for example, the actual message associated with the "post comment" method or the name of a desired weather map. The client application 200a can pass static parameters and request static and dynamic parameters. The client application 200a passes static parameters with the AddParam routine existing in the client MPC layer 206a. Furthermore, the client application 200a requests a dynamic parameter with the RequestDynamicParam routine existing in the client MPC layer 206a. One example of dynamic data is when the client WEATHER application 204a requests a large weather map of unknown size. In the preferred embodiment, the client MPC layer 206a instantiates the dynamic object 430 when a response message 800a containing dynamic data is received from the service MPC layer 206c. Proceeding to routine 1010, once the client application 200a has passed the parameters associated with a remote request, the client application 200a then sends the remote request to the on-line services network 100. To send the remote request, the client application 200a calls the Execute routine existing in the client MPC layer 206a. The Execute routine sends the messages 800a and 800b for a remote request, instantiates the status object 426 and sets the pointers in the status object 426 and the method object 416 to reference each other. The Execute routine in the client MPC layer 206a then sends the request messages 800a and 800b to the service MPC layer 206c. After sending the request messages 800a and 800b, the Execute routine returns control to the client application 200a. The client application 200a proceeds back to state 1000 where the client application 200a continues to execute other program instructions until sending another remote request. Each of the routines invoked by the client application 200a when sending a remote request will now be discussed in detail. FIG. 11 provides a detailed flow chart of the states in the CoCreateInstance routine. The client application 200a calls the CoCreateInstance routine in state 1002 to instantiate the Main MOS object 400 that acts as the root of the client data structure 208a. In the preferred embodiment, the CoCreateInstance routine is an Object Linking and Embedding (OLE) routine that is well known in the art, and is described in OLE 2 Programmer's Reference Vol. I, Microsoft Press, 1993, pp. 256 and in OLE 2 Programmer's Reference Vol. II. Microsoft Press, 1993, pp. 56-62. The CoCreateInstance routine then proceeds to state 1100. In state 1100, the CoCreateInstance routine determines whether the Main MOS object 400 exists in the client data structure 208a. If the Main MOS object 400 does not exist in the client data structure 208a, the CoCreatelnstance routine proceeds to state 1102 and instantiates the Main MOS object 400. For example, when the client CHAT application 202a invokes the CoCreateInstance routine for the first time, the Main Mos object 400 will not exist in the client data structure 208a and the CoCreateInstance routine then instantiates the Main Mos Object 400. If the Main MOS object 400 however, already exists in the client data structure 208a, the CoCreateInstance routine proceeds to return state 1106 and returns control back to the client application 200a. For example, if the client application 200a again invokes the CoCreateInstance routine during the same client user session, the Main MOS object 400 will already exist as the root of the client data structure 208a and the CoCreateInstance routine proceeds to return state 1106. Returning to state 1102, after instantiating the Main MOS object 400, the CoCreateInstance routine proceeds to state 1104. In state 1104, the CoCreateInstance routine stores the Main MOS object 400 as the root of the client data structure 208a. After storing the Main MOS object 400 in the client data structure 208a, the CoCreateInstance routine proceeds to return state 1106 where control is passed back to the client application 200a. FIG. 12 illustrates a detailed flow chart of the execution states in the CreateServiceInstance routine which instantiates a service proxy object and a interface object 410 in preparation of sending a remote request to a service application 200b. The client application 200a passes variables to the CreateServiceInstance routine that identify the desired service and that identify the 16-byte OLE interface identifier associated with a particular request. These variables are predefined and set by a programmer during development of a service application 200b. After the client application 200a invokes the CreateServiceInstance routine in state 1004, the routine proceeds to state 1200 and checks to see if the desired service proxy object 404 already exists in the client data structure 208a. The CreateServiceInstance routine compares the desired service name with the service identifiers 406 in the service proxy objects 404. Preferably, the client data structure 208a is a binary tree and the CreateServiceInstance routine uses binary tree traversal techniques known to one of ordinary skill in the art to find a service proxy object 404 with the desired service identifier 406. When the client CHAT application 202a, for example, sends the first remote request, a service proxy object 404 for the CHAT service 202b does not yet exist. Thus, when the client CHAT application 202a calls the CreateServiceInstance routine for the first time during a client session, the CreateServiceInstance routine will not find the service proxy object 404 for the Chat service 202b in the client data structure 208a. If, however, the client CHAT application 202a has already sent remote requests during this service session to the CHAT service 202b, the service proxy object 404 for the CHAT service 202b will exist in the client data structure 208. If the CreateServiceInstance routine finds the desired service proxy object 404 in the client data structure 208a, the routine proceeds to state 1214. If, on the other hand, the CreateServiceInstance routine cannot find the desired service proxy object 404, the routine proceeds to state 1202. In state 1202, the CreateServiceInstance routine creates the service proxy object 404. Moving to state 1204, the CreateServiceInstance routine requests the client MCP layer 210a to establish a connection with the desired service application 200b. Proceeding to state 1206, the service MPC layer 206b receives a request from the Gateway MCP layer 210b to locate the desired service application 200b using the locator program 314. The Gateway MCP layer 210b then establishes a client-to-server connection with the server MCP layer 210c located on the server running the desired service application 200b. Proceeding to state 1208, the server MCP layer 210c directs the service MPC layer 206c to instantiate a connection object 600 that will maintain a connection with the client process. The service MPC layer 206c also stores the connection information 700 and the user information 702 in the connection object 600. After establishing a connection with the service MPC layer 206c existing in a service application 200b, the service MPC layer 206c proceeds to state 1209. In state 1209, the service MPC layer 206c instantiates the connection object 600 that maintains a connection with the desired service application 200b. The connection object 600 is only established once during a logon session. In the preferred embodiment, the main server object 608 points to a list of connection objects 600 instantiated in state 1209. Proceeding to state 1210, the service MPC layer 206c sends the exported interface list 408 back to the client MPC layer 206a. Whenever a new service application 200b is added to the host data center 104, the service application 200b instantiates the Main server object 608 and the exported interface objects 610 in the service data structure 208b. In addition, upon initiation, the service application 200b directs the service MPC layer 206c to create the exported interface list 408 by calling the ExportInterface routine. The ExportInterface routine queries each exported interface object 610 and obtains the 16-byte OLE interface identifiers assigned to each of the exported interface objects 610. In addition, the ExportInterface routine assigns a one-byte service interface identifier 412 to each exported interface object 610. For example, when the CHAT service 202b is added to the host data center 104, the CHAT service 202b, upon initialization, directs the service MPC layer 206c to instantiate the CHAT main server object 608 and the CHAT exported interface objects 610 in the service data structure 208b. The Chat service 202b directs the service MPC layer 206c to create the exported interface list 408 that stores the 16-byte OLE interface identifier for each exported interface object 610 and the one-byte service interface identifier 412 that corresponds to each exported interface object 610. In state 1210, the service MPC layer 206c sends the exported interface list 408 to the client MPC layer 206a. Proceeding to state 1214, the client MPC layer 206a receives the exported interface list 408 and checks the interface list to ensure that the 16-byte OLE interface identifier requested by the client application 200a exists in the exported interface list 408. If the 16-byte OLE interface identifier requested by the client application 200a exists in the exported interface list 408, the CreateServiceInstance routine proceeds to state 1216. However, if the 16-byte OLE interface identifier requested by the client application 200a does not exist in the exported interface list 408, the CreateServiceInstance routine generates an error message in state 1218 that is passed back to the client application 200a in return state 1224. Returning to state 1214, if the 16-byte OLE interface identifier requested by the client application exists in the exported interface list 408, the CreateServiceInstance routine proceeds to state 1216. In state 1216, the CreateServiceInstance routine ascertains the one-byte service interface identifier 412 which corresponds to the 16-byte OLE interface identifier from the exported interface list 408. Proceeding to state 1220, the CreateServiceInstance routine uses the service interface identifier 412 to determine whether an interface object 410 exists in the client data structure 208a. In state 1220, the CreateServiceInstance routine uses binary tree traversal techniques known to one of ordinary skill in the art to find an interface object 410 with the desired service interface identifier 412. The CreateServicelnstance routine instantiates the interface object 410 for a particular service interface identifier 412 only once during a client session. If the desired interface object already exists, the CreateServiceInstance routine proceeds to return state 1224. For example, when the client CHAT application 202a requests a "post comment" method that is part of a particular interface, the CreateServiceInstance routine only instantiates an interface object 410 for that particular interface once. If the client CHAT application 202a requests another "post comment" method, the CreateServiceInstance routine determines that the interface object 410 exists and does not instantiate a new interface object 410 and proceeds to return state 1224. If, however, the interface object 410 with the proper service interface identifier 412 does not exist in the client data structure 208a, the CreateServiceInstance routine proceeds to state 1222 where it creates an interface object 410 and stores the service interface identifier 412 in the interface object 410. In addition, the CreateServiceInstance routine initially sets the method instance counter 414 in the newly instantiated interface object to zero. After creation of the interface object 410, the CreateServiceInstance routine proceeds to return state 1224. Referring to FIG. 10, after completion of the CreateServiceInstance routine, the client application 200a proceeds to state 1004 and returns an interface object 410 and calls the CreateMethodInstance routine for that interface object 410. When calling the CreateMethodInstance routine, the client application 200a passes the desired method identifier 418 to the CreateMethodInstance routine. Using the method identifier 418, the CreateMethodInstance routine instantiates a method object 416 for the current remote request. FIG. 13A illustrates a detailed flow chart of the execution states in the CreateMethodInstance routine. Upon invocation in state 1006, the CreateMethodInstance routine proceeds to state 1300, where it instantiates the method object 416 and links the method object 416 to the active interface object 410. When creating the method object 416, the CreateMethodInstance routine stores the method identifier 418 in the method object 416. For example, when the client CHAT application 202a requests the "post comment" method, the client CHAT application 202a passes the method identifier 418 for the "post comment" method when the client CHAT application 202a calls the CreateMethodInstance routine. As explained above, the method identifier 418 is defined by a programmer during development of the CHAT application 200a. The CreateMethodInstance routine then instantiates a "post comment" method object 416 and stores the method identifier 418 in the method object 416. In addition, the CreateMethodlnstance routine links the "post comment" method object 416 to the proper interface object 410. Moving to state 1302, the CreateMethodInstance routine also increments the method instance counter 414 in the interface object 410. As explained above, the interface object 410 contains a method instance counter 414 that counts each time a method in that interface is requested by the client application 200a. For example, if the client CHAT application 202a requests the "post comment" method multiple times, the method instance counter 414 is incremented each time. Proceeding to state 1304, the CreateMethodInstance routine stores the value of the method instance counter 414 in the method object 416. This allows the client process to issue multiple simultaneous requests to the same service method. Moving to state 1306, the CreateMethodInstance routine reserves a block of memory in order to store the request messages 800a and 800b associated with the method object 416. Upon completion of state 1306, the CreateMethodInstance routine returns control back to the client application 200a in state 1308. Referring to FIG. 10, after calling the CreateMethodInstance routine, the client application 200a proceeds to state 1008 and adds the client-to-server and server-to-client parameters. As illustrated in FIG. 13B, the client application proceeds to state 1310 and calls the AddParam routine to add static parameters to the method object 416. When the client application 200b invokes the AddParam routine it passes a parameter that is a byte, word, double word or a pointer to a byte, word, double word or a pointer to the static data. The AddParam routine stores the passed static parameter in the method object 416. In addition, the AddParam routine creates the messages 800a and 800b as shown in FIGS. 8A-8C. The messages 800a contain the header 802 and the parameters 804. The header 802 contains the service interface identifier 412, the method identifier 418 and the method instance identifier 420. The AddParam routine obtains the service interface identifier 412 from the interface object 410. The AddParam routine then obtains the method identifier 418 and the method instance identifier 420 from the method object 416. After creating the header 802, the AddParam routine creates the parameters 804 by setting the type field 806 to indicate the type of parameter in the data field 810. If the data field 810 also contains a block of data, the client MPC layer 206a sets the length of memory block field 808 to indicate the size of the data block. After creating the message 800a, the AddParam routine returns control back to the client application 200a. If a static block parameter is larger than 400 bytes, the AddParam routine creates the messages 800a and 800b that send the static block parameter to the service MPC layer 206b. Proceeding to state 1312, if the remote request requires additional static parameters, the client application returns to state 1310 and again calls the AddParam routine. For example, when the client WEATHER application 204a requests the "download weather map" method. The client application 200a passes a variety of static parameters that identify the requested weather map. Once the client application 200a has passed all of the required static parameters, the client application proceeds to state 1314. In state 1314, as explained in more detail below, the client application 200a can, if needed, request dynamic data. In the preferred embodiment, the client application 200a requests a dynamic parameter with the RequestDynamicParam routine. The RequestDynamicParam routine then sets a dynamic flag (not shown) that directs the client MPC layer 206a to instantiate the dynamic object 430 when a response message 800a containing dynamic data is received from the service MPC layer 206c. For example, when the client WEATHER application 204a requests a dynamic weather map, the client WEATHER application 204a calls the RequestDynamicParam routine in state 1308. In state 1314, the RequestDynamicParam routine sets a dynamic flag (not shown) that directs the client MPC layer 206a to instantiate the dynamic object 430 when the dynamic weather map is received from the service MPC layer 206c. After setting the dynamic flag, the RequestDynamicParam routine then passes control back to the client application 200a in a return state 1316. The instantiation of a dynamic object 430 and the storage of dynamic data received by the client MPC layer 206a is further discussed below. Referring now to FIG. 10, the client application 200a sends the remote request by calling the Execute routine in state 1010. The Execute routine instantiates the status object 426 and sends the request messages 800a and 800b to the service application 200b. FIG. 14 illustrates a detailed flow chart of the execution states in the Execute routine. After the client application 200a invokes the Execute routine in state 1010, the Execute routine proceeds to state 1400 and instantiates the status object 426 and links the status object 426 to the current method object 416. Moving to state 1402, the Execute routine sends the request messages 800a and 800b created by the AddParam routine to the service MPC layer 206c. After sending the messages 800a and 800b in state 1402, the Execute routine proceeds to a return state 1404 where the Execute routine returns control back to the client application 200a. b. Generating Multiple Pending Remote Requests. The following example illustrates how the client application 200a generates multiple pending remote requests with the routines in the client MPC layer 206a. In this example, a client user connects to the on-line services network 100, accesses the WEATHER service 204b and requests the WEATHER service 204b to download a dynamic weather map. While downloading a dynamic weather map, the client user accesses the CHAT service 202b and posts two CHAT comments. Referring now to FIG. 10, in state 1000 a client user activates the client WEATHER application 204a and requests a large weather map from the WEATHER service 204b. Proceeding to state 1002, the client WEATHER application 204a calls the CoCreateInstance routine to initialize the client data structure 208a. When calling the CoCreateInstance routine, the client WEATHER application 204a passes the Object Linking and Embedding Main MOS identifier 402 which uniquely identifies the Main MOS object 400 from other Object Linking and Embedding (OLE) objects. Proceeding to state 1100, the CoCreateInstance routine determines whether the Main MOS object 400 exists in the client data structure 208a. In this example, the Main MOS object 400 does not exist in the client data structure 208a and the CoCreateInstance routine proceeds to state 1102 where it instantiates the Main MOS object 400. Proceeding to state 1104, the CoCreateInstance routine stores the Main MOS object 400 as the root of the client data structure 208a. After storing the Main MOS object 400 in the client data structure 208a, the CoCreateInstance routine proceeds to a return state 1106 where control is passed back to the client application 200a. Referring to FIG. 10, the client WEATHER application 204a then proceeds to state 1004 where it calls the CreateServiceInstance routine. In this example, the client WEATHER application 204a calls the CreateServiceInstance routine to instantiate the service proxy object 404 and the interface object 410. When calling the Create ServiceInstance routine, the client WEATHER service 204a passes the name of the WEATHER service 204b and a 16-byte OLE interface identifier that identifies the interface (group of methods) that contains the "download weather map" method. Referring now to FIG. 12, the CreateServiceInstance routine begins in a start state 1004 and proceeds to state 1200. In state 1200, the CreateServiceInstance routine checks to see if the service proxy object 404 for the WEATHER service 204b already exists in the client data structure 208a. In this example, the service proxy object 404 for the WEATHER service does not exist in the client data structure 208a and the CreateServiceInstance routine proceeds to state 1202. In state 1202, the CreateServiceInstance routine creates the service proxy object 404. The CreateServiceInstance routine stores the service proxy object 404 for the WEATHER service 204b in the second level of the client data structure 208a. Moving to state 1204, the CreateServicelnstance routine requests the service MPC layer 206c to establish a connection with the WEATHER service 204b. Proceeding to state 1206, the service MPC layer 206c uses the locator program 314 to locate the WEATHER service 204b in the servers 120. Proceeding to state 1208, the service MPC layer 206c instantiates a connection object 600 that establishes a connection with the WEATHER service 204b. Proceeding to state 1210, the service MPC layer 206c sends the exported interface list 408 for the WEATHER service 204b back to the client MPC layer 206a. Proceeding to state 1214, the client MPC layer 206a receives the exported interface list 408. While in state 1214, the CreateServiceInstance routine compares the passed 16-byte OLE interface identifier, with the OLE interface identifiers in the exported interface list 408. In this example, the exported interface list 408 contains the requested 16-byte OLE interface identifier and the CreateServiceInstance routine proceeds to state 1216. In state 1216, the CreateServiceInstance routine looks up the service interface identifier 412 that corresponds to the specified 16-byte OLE interface identifier in the exported interface list 408. As explained above, the exported interface list 408 contains the one-byte service interface identifier 412 which corresponds to each 16-byte OLE interface identifier. Proceeding to state 1220, the CreateServicelnstance routine checks the client data structure 208a to determine whether the desired interface object 410 exists. This is done by searching a binary tree data structure for the is interface object 410 indexed by its interface service identifier 412. In this example, the interface object 410 does not exist in the client data structure 208a and the CreateServiceInstance routine proceeds to state 1222 where it creates the interface object 410, stores the service interface identifier 412 in the interface object 410 and sets the method instance counter 414 to zero. After creation of the interface object 410, the CreateServiceInstance routine proceeds to return state 1224. With reference to FIG. 10, after completion of the CreateServiceInstance routine, the client WEATHER application 204a proceeds to state 1006 where it invokes the CreateMethodInstance routine in the client MPC layer 206a for the remote request. The CreateMethodInstance routine instantiates the method object 416 for the "download weather map" method. When the client application 200a calls the CreateMethodInstance routine it passes the method identifier 418 associated with the "download weather map" method. Referring to the detailed flow chart in FIG. 13A, upon invocation in state 1006, the CreateMethodlnstance routine proceeds to state 1300, where it instantiates the method object 416, and links the method object 416 to the proper interface object 410. When instantiating the method object 416, the CreateMethodInstance routine stores the method identifier 418 for the "download weather map" method in the method object 416. Moving to state 1302, the CreateMethodInstance routine increments the method instance counter 414 in the interface object 410. The CreateMethodInstance routine then stores the value of the method instance counter 414 as the method instance identifier 420. Moving to state 1306, the CreateMethodInstance routine reserves a block of memory in order to store the request message 800a associated with the "download weather map" method object 416. Upon completion of state 1306, the CreateMethodInstance routine returns control back to the client WEATHER application 204a in state 1308. Referring to FIG. 10, after calling the CreateMethodInstance routine, the client WEATHER application 204a proceeds to state 1008 and adds the client-to-server and server-to-client parameters. Referring to FIG. 13B, the client application proceeds to state 1310 and calls the AddParam routine. In this example, the client WEATHER application 204a uses the AddParam routine to store the parameters that identify the desired weather map in the method object 416. The parameters could include, for example, the weather map's name and date. While in state 1310, the AddParam routine also creates the request message 800a for the "download weather map" method. As shown in FIGS. 8A and 8B, the messages 800a contain the header 802 and the parameters 804. Using the service interface identifier 412 from the interface object 410, as well as, the method identifier 418 and the method instance identifier 420 from the method object 416, the AddParam routine generates the message header 802. The AddParam routine also adds the passed parameters 804 to the message header 802. For example, Table 2 illustrates a request message 800a that requests the WEATHER service 204b to download a particular weather map. The service identifier 412 specifies the interface of the "download weather map" method. In this example, the service interface identifier contains the value of 0.times.01h (the first interface). The method identifier 418 identifies the "download weather map" method which in this example is identified with the value 0.times.04h (i.e. there are 4 other methods 0, 1, 2, and 3 in this interface and this is the 5th method). The method instance identifier 420 contains the value 0.times.01h and indicates that this is the first time a method was called in this particular interface. The type field 806 contains the value 0.times.04h which indicates that the name of the weather map is a data block that exists in the data field 810. The length of memory block field 808 indicates the length of the weather map name in bytes. The data field 810 contains the name of the weather map which in this example is "weather map 17" (12 bytes or 0.times.0Ch). The next type field 806 contains the value 0.times.85h which requests the service MPC layer 206b to download the request weather map as a dynamic data block.
TABLE 2
Length of
Service Method Method Memory
Interface Inenti- Instance Type Block Data Type
Identifier fier Identifier Field Field Field Field
0x01h 0x04h 0x01h 0x04h 0x000Ch weather 0x85h
map 17
Once the client WEATHER application 204a has passed all of the required static parameters needed to identify the desired map, the client WEATHER application proceeds to state 1314. In this example, the weather map comprises dynamic data (i.e., the service MPC layer 206c will download the weather map incrementally). Thus, in state 1314 the client WEATHER application 204a calls the RequestDynamicParam routine to specify that the weather map comprises dynamic data. While in state 1314, the RequestDynamicParam routine sets a dynamic flag that directs the client MPC layer 206a to instantiate a dynamic object 430 when the client MPC layer 206a begins receiving the dynamic data. In addition, the RequestDynamicParam routine creates a message 800a that requests dynamic data. The RequestDynamicParam routine then passes control back to the client application 200a in a return state 1316. Referring now to FIG. 14, the client WEATHER application 204a calls the Execute routine in state 1010 to instantiate the status object 426 and to send the "download weather map" request message 800a to the service application 200b. After invoking the Execute routine in state 1010, the Execute routine proceeds to state 1400 and instantiates the status object 426. Proceeding to state 1402, the Execute routine sends the message 800a created by the AddParam routine and the RequestDynamicParam routine. After sending the message 800a in state 1402, the Execute routine proceeds to a return state 1404 where the Execute routine returns control back to the client application 200a. While the service MPC layer 206c processes the "download weather map" request, the client application 200a is now free to check the status of the pending remote request or to issue other remote requests. In this example, multiple pending remote requests are generated when the client user sends a remote request to the CHAT service 202b to post a CHAT comment while the remote request for the weather map is still pending. In this example, referring to FIG. 10, a client user activates the client CHAT application 202a in state 1000. The client user then writes a CHAT comment and selects the command that requests the Chat service 202b to post the CHAT comment. The client CHAT application 202a then calls the CoCreateInstance routine. Referring to FIG. 11, the CoCreateInstance routine, then proceeds to state 1100. In state 1100, the CoCreateInstance routine determines whether the Main MOS object 400 exists in the client data structure 208a. In this example, the Main MOS object 400 exists and the CoCreateInstance routine finds the Main MOS object 400 in the root of the client data structure 208a. The CoCreateInstance routine then proceeds to return state 1106. As explained above in this example, during this user session, the Main MOS object 400 was instantiated by the client WEATHER application 204a. Referring to FIG. 10, the client CHAT application 202a then proceeds to state 1004 where it calls the CreateServiceInstance routine to instantiate the service proxy object 404 for the CHAT service 202b and the interface object 410 associated with the "post comment" request. When calling the CreateServiceInstance routine, the client CHAT application 200a passes the name of the CHAT service 202b and the OLE interface identifier that identifies the interface associated with the "post comment" request. Proceeding to state 1200 the CreateServiceInstance routine checks to see if the service proxy object 404 for the CHAT service 202b already exists in the client data structure 208a. In this example, the service proxy object 404 for the CHAT service 202b does not exist in the client data structure 208a and the CreateServiceInstance routine proceeds to state 1202. In state 1202, the CreateServiceInstance routine creates the service proxy object 404 for the CHAT service 202b. Moving to state 1204, the CreateServiceInstance routine requests the service MPC layer 206c to establish a connection with the CHAT service 202b. Proceeding to state 1206, the service MPC layer 206c uses the locator program 314 to locate the CHAT service 202b in the servers 120. Proceeding to state 1208, the service MPC layer 206c instantiates a connection object 600 that establishes a connection with the CHAT service 202b. Proceeding to state 1210, the service MPC layer 206c sends the exported interface list 408 for the CHAT service 202b back to the client MPC layer 206a. Proceeding to state 1214, the client MPC layer 206a receives the exported interface list 408. While in state 1214, the CreateServiceInstance routine compares the requested OLE interface identifier, with the OLE interface identifiers in the exported interface list 408. In this example, the exported interface list 408 contains the requested OLE interface identifier and the CreateServiceInstance routine proceeds to state 1216. In state 1216, the CreateServiceInstance routine looks up the one-byte service interface identifier 412 in the exported interface list 408. Proceeding to state 1220, the CreateServiceInstance routine checks the client data structure 208a to determine whether the desired interface object 410 exists. In this example, the interface object 410 does not exist in the client data structure 208a and the CreateServiceInstance routine proceeds to state 1222 where it creates the interface object 410, stores the service interface identifier 412 in the interface object 410 and sets the method instance counter 414 in the interface object 410 to zero. After creation of the interface object 410, the CreateServiceInstance routine proceeds to return state 1224. With reference to FIG. 10, after completion of the CreateServicelnstance routine, the client CHAT application 202a proceeds to state 1006 where it calls the CreateMethodInstance routine in the client MPC layer 206a. The CreateMethodInstance routine instantiates the method object 416 for the "post comment" method. When the client application 200a calls the CreateMethodInstance routine it passes the method identifier 418 associated with the "post comment" method. As illustrated in FIG. 13A, the CreateMethodInstance routine proceeds to state 1300, where it instantiates the method object 416, and links the method object 416 to the active interface object 410. When creating the method object 416, the CreateMethodInstance routine stores the method identifier 418 for the "post comment" method in the method object 416. Moving to state 1302, the CreateMethodInstance routine also increments the method instance counter 414 in the interface object 410 and stores the value of the method instance counter 414 in the method instance identifier 420. Moving to state 1306, the CreateMethodInstance routine reserves a block of memory in order to store the request message 800a associated with the "post comment" method object 416. Upon completion of state 1306, the CreateMethodInstance routine returns control back to the client CHAT application 202a in state 1308. Referring to FIG. 10, after calling the CreateMethodInstance routine, the client CHAT application 202a proceeds to state 1008 and adds the client-to-server and server-to-client parameters. Referring to FIG. 13B, the client application 200a proceeds to state 1310 and calls the AddParam routine. In this example, the client CHAT application 202a calls the AddParam routine to add the comment for posting on the CHAT service 202b. While in state 1008, the AddParam routine creates the request messages 800a for the "post comment" method. Using the service interface identifier 412 from the interface object 410, as well as, the method identifier 418 and the method instance identifier 420 from the method object 416, the AddParam routine generates the message header 802. The AddParam routine then adds the passed parameters 804 to the message header 802. Once the client CHAT application 202a has passed all of the required static parameters needed to transmit the comment, the client CHAT application 202a proceeds to state 1314. Since the client CHAT application 202a is not requesting dynamic data, the client CHAT application does not invoke the RequestDynamicParam routine. Proceeding to state 1010, the client CHAT application 202a calls the Execute routine to instantiate the status object 426 and to send the "post comment" request message 800a to the service application 200b. After invoking the Execute routine in state 1010, the Execute routine proceeds to state 1400 and instantiates the status object 426. Moving to state 1402, the Execute routine sends the "post comment" request message 800a to the service MPC layer 206c. The Execute routine then proceeds to the return state 1404 where the Execute routine returns control back to the client CHAT application 202a. While the CHAT service 202b begins posting the comment, the client application 200a is now free to check the status of the pending remote requests or issue other remote requests. In this example, the client user now sends a second remote request to the CHAT service 202b. Referring now to FIG. 10, in state 1000, the client user drafts a second comment and again selects the command to post another CHAT comment. Proceeding to state 1002, the client CHAT application 202a calls the CoCreateInstance routine. Referring to FIG. 11, the CoCreateInstance routine, begins in a start state 1002 and proceeds to state 1100. In state 1100, the CoCreateInstance routine determines whether the Main MOS object 400 exists in the client data structure 208a. In this example, the CoCreatelnstance routine finds the Main MOS object 400 in the root of the client data structure 208a. The CoCreateInstance routine then proceeds to return state 1106. Referring to FIG. 10, the client CHAT application 202a then proceeds to state 1004 where it calls the CreateServiceInstance routine to instantiate the proxy object 404 for the CHAT service 202b and the interface object 410 associated with the "post comment" request. When calling the CreateServiceInstance routine, the client CHAT application 200a passes the name of the CHAT service application 202b and the OLE interface identifier that identifies the interface associated with the "post comment" request. Proceeding to state 1200 the CreateServiceInstance routine checks to see if the service proxy object 404 for the CHAT service 202b already exists in the client data structure 208a. In this example, the service proxy object 404 for the CHAT service already exists in the client data structure 208a (it was created for the previous "post comment" request) and the CreateServiceInstance routine proceeds to state 1214. In state 1214, the client MPC layer 206a compares the requested OLE interface identifier with the OLE interface identifiers in the exported interface list 408. In this example, the exported interface list 408 contains the requested OLE interface identifier and the CreateServiceInstance routine proceeds to state 1216. In state 1216, the CreateServiceInstance routine looks up the one-byte service interface identifier 412 in the exported interface list 418. Proceeding to state 1220, the CreateServicelnstance routine checks the client data structure 208a to determine whether the desired interface object 410 exists. In this example, the interface object 410 already exists in the client data structure 208a and the CreateServiceInstance routine proceeds to return state 1220. With reference to FIG. 10, after completion of the CreateServiceInstance routine, the client CHAT application 202a proceeds to state 1006 where it invokes the CreateMethodInstance routine in the client MPC layer 206a. The CreateMethodInstance routine instantiates the method object 416 for the "post comment" method. When the client application 200a calls the CreateMethodInstance routine it passes the method identifier 418 associated with the "post comment" method. As illustrated in FIG. 13A, upon invocation in state 1006, the CreateMethodInstance routine proceeds to state 1300, where it instantiates a second "post comment" method object 416, and links the method object 416 to the active interface object 410. When creating the second method object 416, the CreateMethodInstance routine stores the method identifier 418 for the second "post comment" method in the method object 416. Moving to state 1302, the CreateMethodInstance routine also increments the method instance counter 414 in the interface object 410. Because this is the second "post comment" method, the method instance counter 414 is incremented to two. Proceeding to state 1304, the CreateMethodInstance routine stores the value of the method instance counter 414 in the method instance identifier 420. Moving to state 1306, the CreateMethodInstance routine reserves a block of memory in order to store the request message 800a associated with the second "post comment" method object 416. Upon completion of state 1306, the CreateMethodInstance routine returns control back to the client CHAT application 202a in state 1308. Referring to FIG. 10, after calling the CreateMethodInstance routine, the client CHAT application 202a proceeds to state 1008 and adds the client-to-server and server-to-client parameters. Referring to FIG. 13B, the client application proceeds to state 1310 and calls the AddParam routine. In this example, the client CHAT application 202a calls the AddParam routine to add the second comment for posting on the CHAT service 202b. While in state 1008, the AddParam routine also creates the request messages 800a for the second "post comment" method. Using the service interface identifier 412 from the interface object 410, as well as, the method identifier 418 and the method instance identifier 420 from the method object 416, the AddParam routine generates the message header 802. The AddParam routine then adds the passed parameters 804 to the message header 802. once the client CHAT application 202a has passed all of the required static parameters needed to transmit the comment, the client CHAT application 202a proceeds to state 1314. Since the client CHAT application 202a is not requesting dynamic data, the client CHAT application does not invoke the RequestDynamicParam routine. Proceeding to state 1010, the client CHAT application 202a calls the Execute routine to instantiate the status object 426 and to send the "post comment" request message 800a to the service application 200b. After invoking the Execute routine in state 1010, the Execute routine proceeds to state 1400 and instantiates the status object 426. Moving to state 1402, the Execute routine sends the "post comment" request message 800a to the service MPC layer 206c. The Execute routine then proceeds to the return state 1404 where the Execute routine returns control back to the client CHAT application 202a. The above example shows how the routines in the client MPC layer 206a build the client data structure 208a and allow the client applications 200a to continue operation while waiting for responses to pending remote requests. c. Responding to Remote Requests. As illustrated in FIG. 12, when the service MPC layer 206c receives an indication from the server MPC layer 210c that a client process would like to establish a connection in state 1209, the service MPC layer 206c instantiates the connection object that maintains a connection with the desired client application 200a. The connection is only established once during a logon session. For example, when connecting to the CHAT service 202b, the connection object 600 identifies a particular client-server connection between the client MPC layer 206a and the service MPC layer 206c. In the preferred embodiment, the main server object 608 points to a list of connection objects 600 identifying various connections. Proceeding to state 1210, the service MPC layer 206c sends the exported interface list 408 to the client MPC layer 206a. After establishing a connection, the service MPC layer 206b waits for the request messages as illustrated in FIG. 15. Beginning in a start state 1500, the service MPC layer 206c waits until it receives a request in state 1502. Once the service MPC layer 206c receives a request message 800a or 800b, it proceeds to state 1504. In state 1504, the service MPC layer 206c determines whether the request message is an upload message 800b. As explained above, when the client MPC layer 206a sends a memory block parameter in incremental portions, each incremental portion contains the upload field 812 at the beginning of the upload message 800b. In the preferred embodiment, the value 0.times.E6h (230) in the upload field indicates that other upload messages 800b exist and the value 0.times.E7h (231) indicates the last upload message 800b has been received for that parameter. It is possible that there will be other messages 800b that correspond to other client-to-server memory block parameters, identified by a different upload parameter identifier 814. If the request message 800a contains the header 802, the service MPC layer proceeds to state 1506 and instantiates the request object 602. For example, if the request message 800a does not contain an incremental portion of a client-to-server static data block the service MPC layer proceeds to state 1506. Thus, the service MPC layer 206c only proceeds to state 1508 when the upload message 800b does not contain the header 802. Proceeding to state 1506, the service MPC layer 206a instantiates a request object 602 using techniques known to one of ordinary skill in the art. While in state 1506, the service MPC layer 206c creates a pointer in the connection object 600 that references the request object 602. This allows one client application 200a (identified by the connection object 600) to issue multiple requests that are identified by the request objects 602. Proceeding to state 1510, the service MPC layer parses the request message 800a. By parsing the message header 802, the service MPC layer obtains the service interface identifier 412, the method identifier 418, and the method instance identifier 420. In addition, the service MPC layer 206c obtains the parameters 804 from the message 800a. The service MPC layer 206c then stores the service interface identifier 412, the method identifier 418, the method. instance identifier 420 and the parameters 804 in the request object 602. Proceeding to state 1512, the service MPC layer 206c determines whether the request message 800a contains a cancellation request. The service MPC layer 206c determines if the request message 800a contains a cancellation request by analyzing the type field 806. In the preferred embodiment, a cancellation request contains the value 0.times.0Fh in the type field 806. If the request message 800a contains a cancellation request, the service MPC layer 206c proceeds to the cancellation routine in state 1514 which is discussed in further detail below. If the request message 800a does not contain a cancellation request, the service MPC layer 206c proceeds to state 1509. Returning to state 1512, if the request message 800a does not contain a cancellation request, the service MPC layer 206c proceeds to state 1516 and determines whether the request message 800a relates to an incremental upload of static data. In the preferred embodiment, the type field 806 contains the value 0.times.05h if the request message 800a contains an incremental upload. If the request message 800a relates to an incremental upload, the service MPC layer 206c proceeds to return state 1536 since the service MPC layer 206c does not begin processing the request until it has received all of the upload messages 800b. If the request message 800a does not relate to an incremental upload, the service MPC layer 206c proceeds to state 1518 and adds the remote request to the request queue 604. Before proceeding with the discussion about the request queue 604, the flow chart illustrates the process of obtaining all the upload messages 800b related to the transmission of a static dynamic block from the client MPC layer 206a to the service MPC layer 206c beginning in state 1504. Therefore, returning to state 1504, if the request message 800b is a continuation of an upload message 800b, the service MPC layer 206c proceeds to state 1508 and locates the request object 602 associated with the upload message 800b (the service MPC layer created the request object 602 when the first message 800a was received). The service MPC layer 206c identifies the proper request object 602 by locating the request object 602 containing the same upload parameter identifier 814. As explained above, the upload parameter identifier 814 uniquely identifies the memory block associated with the incremental portion in the upload message 800b. Proceeding to state 1520, the service MPC layer 206c adds the incremental portion of the upload message 800b to the request object 602. Proceedin | ||||||
