Content Access Framework provides a generic mechanism for exploring
files that contain multiple content objects. These files are often
referred to as archive files. This can be .ZIP compression archive or a DRM protected archive, such as an OMA .DCF file. An application can explore the content objects
inside a file using the ContentAccess::CContent class.
An archive file can have content objects and meta-data or information associated with the content. This meta-data can include information, such as the MIME type of the content, the encryption algorithm, the compressed size of the content. This information can be retrieved from the attributes related to a content object, see Content Object Attributes.
The content and meta-data may also be arranged in a hierachy with container objects grouping content objects together. A typical archive can have a complex structure as the example shown below:

In this scenario, the file itself can be considered as the
top level container. All other content, containers and meta-data are
nested inside. In an archive file, applications can quickly search
for the content objects they are interested in by using ContentAccess::CContent::Search(), see Consumer
API Tutorial.
Archive files containing several content objects cannot be referred to using just the URI of the file. The Content Access Framework uses a concept of virtual paths to identify content objects within a file. The virtual path is a combination of the file URI and a unique identifier supplied by the agent:
A content file is only handled by the agent that recognises
it. The unique identifier is not required to be decoded by anyone
other than the agent that generated it, so the format is left for
the agent to implement as it sees fit. For instance, an OMA DRM agent
may put the Content ID (CID) in the UniqueId field.
The only constraint is that the UniqueId must
be unique within the file. An application must be able to directly
reference a content object just using the UniqueId.
Virtual path pointer objects on the stack
The ContentAccess::TVirtualPathPtr is used to point to two descriptors holding the URI of a file and
the UniqueId of a content object within the file.
It can also be used to point to another TVirtualPathPtr. Since it is only a pointer, the original descriptors used to initalise
the TVirtualPathPtr must not be destroyed or modified
while the TVirtualPathPtr is still in use.
The ContentAccess::CVirtualPath class stores the file URI and
content object UniqueId in its own descriptors. There
is a cast operator that allows the CVirtualPath to
be used as if it were a TVirtualPathPtr .
Examples
// Open a CContent object to browse the objects inside a file
CContent *c = CContent::NewL(_L("C:\file.dcf"));
CleanupStack::PushL(c);
// Create an array to store the embedded objects
RStreamablePtrArray<CEmbeddedObject> myArray;
// Get an array of the embedded objects within the current container in the file
c->GetEmbeddedObjects(myArray);
// If necessary we can get a "mangled" version of the URI that
// references the particular object within the file
// i.e. "C:\file.dcf\\OBJECT1"
CData* data = iContent->OpenContentL(EPlay,myArray[0]->UniqueId());
TFileName uri;
data->GetStringAttribute(EPreviewURI,uri);
.
.
.
// Now we can use our TPtrC later to create a TVirtualPath object from a URI
TVirtualPathPtr aPtr = aURI;
// print the file URI "C:\file.dcf"
printf(aPtr.URI());
// print the content object's UniqueId "OBJECT1"
printf(aPtr.UniqueId());
// Create a copy of the virtual path on the heap so we don't have any ownership problems
CVirtualPath *myVirtualpath = CVirtualPath::NewL(aPtr)
// Can now delete the CContent object without losing our VirtualPath
CleanupStack::PopAndDestroy(c); KNullDesC16() - ""
A zero length UniqueId is used to refer
to the entire file. If a file is opened this way, no translation of
the contents is performed. The ability to open the file with no translation
is required for example to attach the file to an outgoing message.
As with any other function in CAF, access to the file is at the agent's
discretion.
KDefaultContentObject() - "DEFAULT"
Allows an application to refer to the default content object
within a file. In the case of an unprotected file handled by the F32Agent, it is the entire file, the same as if the UniqueId "" was used. Other agents, particularly
those with a single content object embedded within the file, use "DEFAULT" to refer to their only content object.
Even though the DEFAULT content object is supported,
it is recommended that agents always use CContent to enumerate the objects within the file.