views:

32

answers:

0

Hi, this question may seem a bit too specific, but I figure I'd give it a shot here since I've found some great programming answers here in the past.

I am modifying the open-source program TinyCad for a project I'm working on. I've visited the TinyCad message board and posted, but I didn't get the answer I'm looking for. I'm having trouble wrapping my head about how to integrate a small XML converter class I wrote into the loading function of TinyCad.

A little background about me: I have no experience with MFC or Visual Studio, but that is what I have to use. I am used to C++ and was taught using iostream syntax (cout, cin, new, etc.) so I'm not used to older C code (like printf, sprintf, malloc, alloc, etc.) either. I usually write my programs from start to finish in Qt, but I was told that for this project I should modify an existing program to save time. I don't know if it'll save that much time if I have to learn something totally foreign, but I digress.

I wrote a small class to read in an XML file that is structured differently than the XML file that TinyCad reads in. My class converts it and outputs an intermediate XML file. Well, I don't want to spit out an intermediate file. I modified it to save the output as a string (using the string datatype from the standard C++ iostream library). I want to get this string into a stream so that TinyCad can open the file, do the conversion, and then continue loading.

My class is called like so:

std::string blah;
char* filename = "library.xml";
XMLopen myXML(filename, blah);

So it takes in a filename, opens the file, parses the relevant information out of the file, puts the information into TinyCad's XML structure, and saves the XML code as a string that has been passed by reference.

I had an idea to use istringstream to make a stream, but that did not play nice with CFile. I tried it like so:

istringstream ins; // Declare an input string stream.
ins.str(blah);

// First open the stream to save to
CFile theFile(ins);

Below is the code in TinyCad that opens and loads the selected XML file:

void CLibraryStore::LoadXML( const TCHAR *filename )
{

    // First open the stream to save to
    CFile theFile;

    // Open the file for saving as a CFile for a CArchive
    BOOL r =  theFile.Open(filename, CFile::modeRead);

    if (r) 
    {
        CString name;

        // Create the XML stream writer
        CStreamFile stream( &theFile, CArchive::load );
        CXMLReader xml( &stream );

        // Get the library tag
        xml.nextTag( name );
        if (name != "Library")
        {
            Message(IDS_ABORTVERSION,MB_ICONEXCLAMATION);
            return;
        }
        xml.intoTag();

        CTinyCadApp::SetLockOutSymbolRedraw( true );
        while ( xml.nextTag( name ) )
        {
            // Is this a symbol?
            if (name == "SYMBOL")
            {
                 // Load in the details
                 xml.intoTag();
                 CTinyCadMultiSymbolDoc temp_doc;
                 drawingCollection drawing;
                 CLibraryStoreNameSet s;

                 // this is where the stream gets sent to be loaded into the data structure
                 s.LoadXML( &temp_doc, xml );
                 xml.outofTag();

                 // ... and store the symbol
                 Store( &s, temp_doc );
            }
        }
        xml.outofTag();

        CTinyCadApp::SetLockOutSymbolRedraw( false );

    }
}

Edit 7/28/2010 5:55PM

So I tried to make a stream, but it fails.

CStreamFile takes in a filename and then gets set as a CArchive:

m_pArchive = new CArchive( theFile, nmode );

I tried to make a CStream like so (since CStreamFile is an overloaded CStream):

CString test = blah.c_str();
CStreamMemory streamCS;
streamCS << test;
CXMLReader xml( &streamCS );

But at streamCS << test; it doesn't put the stream in at all. test gets assigned correctly with blah so I know that's working.

Any ideas on how to approach this?